我正在尝试根据现有模型中的字段动态生成新模型。两者都定义在/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)
我不确定copy.copy()
ing Fields 是否会起作用,但我没有深入了解:类定义中列出的字段实际上并未作为类对象的属性包含在内。我假设它们被用于一些元类恶作剧。
在调试器中四处寻找之后,我发现了某些类型的 Field 对象列在People._meta.local_fields
. 但是,这些不仅仅是可以copy.copy()
编辑和用于描述另一个模型的简单描述。例如,它们包含.model
引用的属性People
。
如何根据现有模型的字段为新模型创建字段描述?