有一点背景:我正在尝试构建一个强大的动态查询集表单,以允许半权用户(营销人员?)深入访问分析数据。
我已经构建了一个提供字段查找键的函数,例如,给定一个类似的模型:
class Profile(models.Model):
user = models.OneToOneField("auth.User")
age = models.PositiveIntegerField()
我有一个返回的递归函数:
[
'id',
'user',
'user__id',
'user__username',
'user__first_name',
#...snip...
'user__is_active',
'user__date_joined',
#...snip...
'user__groups__permissions',
'user__groups__permissions__id',
'user__groups__permissions__name',
#...snip...
'age',
]
我想要发生的是,在用户选择他们选择的密钥后,显示&解释适当的标准表单字段(小部件),类似于ModelForm的作用,但我首先需要该字段的类型。
那么我将如何提供类似'age','user__date_joined'和'user_ groups _permissions__name'的函数并返回PositiveIntegerField,DateField和CharField(分别?)。
我假设Django必须在ORM中执行此操作,因此我确信功能已融入Django 某处,我还没有找到它。
答案 0 :(得分:2)
您想要的信息位于类的元属性中:
Profile._meta.get_field_by_name('field_name')
返回:
(field_object, model, direct, m2m)
如果从模型对象获得model
,而不是直接从类对象中获取direct
,则m2m
如果模型上存在该字段(而不是作为结果生成)则为真ORM的查找),parts = field_name.split('__')
cur_model = model
for name in parts:
(field, _, _, _) = cur_model._meta.get_field_by_name(name)
cur_model = field.rel.to
是,如果这个字段是多对多关系的一部分。
[编辑'__'关系]
在Django源代码(db / models / sql / query.py)中,他们使用以下代码反汇编字段类型。我无法说话,但它看起来在语义上是正确的:
rel.to
这基本上说对于外键关系,字段只包含ID,而{{1}}是Django实际获取字段引用的模型所使用的,并且此循环通过字段列表下降,直到它找到你字符串中的最后一个。