【问题标题】:Given a QS field lookup key, how to find fields type across joins?给定一个 QS 字段查找键,如何跨连接查找字段类型?
【发布时间】:2011-11-07 19:12:37
【问题描述】:

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

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

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 会做的事情,但我首先需要该字段的类型。

那么,我将如何提供一个函数,例如“年龄”、“user__date_joined”和“user_groups_permissions__name”,然后分别返回 PositiveIntegerField、DateField 和 CharField?。 p>

我假设 Django 必须在 ORM 中执行此操作,所以我确信该功能已融入 Django 某处,但我还没有找到它。

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    你想要的信息在类的元属性中:

    Profile._meta.get_field_by_name('field_name')
    

    这会返回:

    (field_object, model, direct, m2m)
    

    model 如果您从模型对象而不是直接从类对象中获取,则填充该字段,如果该字段存在于模型上,direct 为真(而不是作为 ORM 查找的结果生成) ),而m2m 是,好吧,如果这个字段是多对多关系的一部分。

    [编辑“__”关系]

    在 Django 源代码 (db/models/sql/query.py) 中,他们使用以下代码对字段类型进行反汇编。我不能跟它说话,但它看起来在语义上是正确的:

    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
    

    这基本上是说对于外键关系,该字段仅包含 ID,而 rel.to 是 Django 用于实际获取该字段所引用的模型,并且此循环遍历字段列表直到找到字符串中的最后一个。

    【讨论】:

    • 这当然适用于直接在模型上的任何字段,但是,如果使用像 '__' 这样的分隔符,它会失败。
    • @Bryan:我添加了一个简单的示例,使用从 Django 自己的内部代码派生的循环,它显示了如何为 ForeignKey 关系执行此操作。
    • 谢谢!我会尝试看看是否有帮助。
    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多