既存のモデルのフィールドに基づいて、新しいモデルを動的に生成しようとしています。どちらも で定義されてい/apps/main/models.py
ます。既存のモデルは次のようになります。
from django.db import models
class People(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
height = models.IntegerField()
コピーしたいフィールドの名前を含むリストがあります。
target_fields = ["name", "age"]
で名前が付けられたすべてのフィールドを持つ新しいモデルを生成したいのですtarget_fields
が、この場合はインデックスを作成する必要があります ( db_index = True
)。
私は当初、 のクラス プロパティを反復処理し、定義されているフィールドの説明をコピーするためにPeople
使用できることを望んでいました。copy.copy
このような:
from copy import copy
d = {}
for field_name in target_fields:
old_field = getattr(People, field_name) # alas, AttributeError
new_field = copy(old_field)
new_field.db_index = True
d[field_name] = new_field
IndexedPeople = type("IndexedPeople", (models.Model,), d)
ing Fields が機能するかどうかはcopy.copy()
わかりませんでしたが、調べるには十分ではありませんでした: クラス定義にリストされているフィールドは、実際にはクラス オブジェクトのプロパティとして含まれていません。代わりに、メタクラスの悪ふざけに使用されていると思います。
デバッガーを調べてみたところ、 にリストされているタイプの Field オブジェクトが見つかりましたPeople._meta.local_fields
。copy.copy()
ただし、これらは、編集して別のモデルを説明するために使用できる単純な説明ではありません。たとえば、 を.model
参照するプロパティが含まれPeople
ます。
既存のモデルのフィールドに基づいて新しいモデルのフィールド記述を作成するにはどうすればよいですか?