我正在尝试动态生成一个新的模型,基于现有模型中的字段。这两个模型都在/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()
复制字段,但我并没有继续进行下去以找出答案:在类定义中列出的字段实际上并未包含在类对象的属性中。我猜想它们被用于一些元类骗局。在调试器中查看后,我发现
People._meta.local_fields
中列出了某些类型的Field对象。然而,这些不仅仅是可以copy.copy()
并用于描述另一个模型的简单描述。例如,它们包括一个指向People
的.model
属性。如何基于现有模型的字段创建新模型的字段描述呢?
ForeignKey
引用。)这些事实与我的动机相关,但不是核心技术问题;我认为它们会分散注意力。 - Jeremy