【问题标题】:How to detect if a Model property is a foreign key relation? (And retreive all FK Model objects)如何检测模型属性是否是外键关系? (并检索所有 FK 模型对象)
【发布时间】:2019-11-20 23:40:32
【问题描述】:

我正在尝试创建一个使用 django 对象动态传播的表,其中每一行都是一个 django 模型对象。如果对象属性是外键,则目标是显示所有可能的 FK 选项的下拉列表。为此,我需要检测对象字段是否为 FK,然后检索所有 FK 对象。

这有两个组成部分:

  • 我正在努力确定对象属性是否是 FK 关系
  • 我正在努力获取与 FK 相同型号的所有对象

伪代码的想法是:

for field in object.fields:
  if field is FK:
    return field.objects.all()
  else:
    return field

我知道我可以测试 ForwardManyToOneDescriptor 关系(如下),但是是否有更紧凑的通用方法来测试 FK 关系?

isintance(Foo.bar, db.models.fields.related_descriptors.ForwardManyToOneDescriptor):

有没有办法通过模型类或类的实例来获取 FK 的所有模型对象? Foo.bar.all()Foo.objects.first().bar.all()

【问题讨论】:

    标签: python django python-3.x django-models django-templates


    【解决方案1】:

    您可以访问 _meta 对象并遍历字段,而不是迭代对象字段,例如:

    from django.db import model
    
    [f for f in t._meta.get_fields() if isinstance(f, models.ForeignKey)]

    您可以获取引用的模型:

    [f<b>.related_model</b> for f in t._meta.get_fields() if isinstance(f, models.ForeignKey)]

    因此,您可以获得包含所有对象的查询集:

    [f.related_model<b>.objects.all()</b> for f in t._meta.get_fields() if isinstance(f, models.ForeignKey)]

    【讨论】:

    • 谢谢! models.ForeignKey 正是我想要的。不幸的是,在最后一个示例中,f.model 返回初始模型 Foo,而不是对象 Bar 的 FK 实例。
    • 看起来最终的解决方案是'f.related_model.objects.all()'
    • @MaxChandler:啊,是的。抱歉,不知何故我感到困惑并交换了两者。谢谢。
    • 不用担心,感谢您的帮助!我更新了您的答案以反映这一点。
    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 2022-12-10
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多