给定QS字段查找键,如何查找跨连接的字段类型?

时间:2011-08-31 16:50:16

标签: django django-models django-forms

有一点背景:我正在尝试构建一个强大的动态查询集表单,以允许半权用户(营销人员?)深入访问分析数据。

我已经构建了一个提供字段查找键的函数,例如,给定一个类似的模型:

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 某处,我还没有找到它。

1 个答案:

答案 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实际获取字段引用的模型所使用的,并且此循环通过字段列表下降,直到它找到你字符串中的最后一个。