Django 通过 ForeignKey 反向查找

Posted

技术标签:

【中文标题】Django 通过 ForeignKey 反向查找【英文标题】:Django reverse lookup by ForeignKey 【发布时间】:2011-05-09 23:17:00 【问题描述】:

我有一个 django 项目,它有两个应用程序,一个是 AppAAppB。现在AppA有模特 ModelA 被模型ModelBAppB 中引用,使用modelA = models.ForeignKey(ModelA, related_name='tricky')

现在在我看来 AppA,当它显示 ModelA 时,我执行 get_object_or_404(ModelA, pk=prim_id)。然后我想获取所有具有指向ModelA 的外键的ModelBs。

文档说我应该做一个mb = ModelB.objects.get(pk=prim_id) 然后mb.modela_set.all()

但是,它在mb.modela_set 上失败了,它显示为"ModelB object has no attribute 'suchsuch'"。请注意,我将 related_name 字段添加到 ForeignKey,因此我也尝试了该字段,包括 mb.tricky.all()mb.tricky_set.all() 均无济于事。

哦,我已经为AppA 指定了一个不同的管理器,我在其中执行objects = MyManager(),它返回正常查询但应用了过滤器。

可能是什么问题?让ModelBs 引用ModelA 的首选方法是什么?

【问题讨论】:

啊,我搞砸了,应该调用 ModelA.tricky.all() 来让 modelbs 引用 ModelA ...而不是 ModelB.tricky.all() Gah。 如果您认为您的问题描述有误,请将其修改为正确的。您还可以包含您的经理代码! @lazerscience,不,我描述的没错。 【参考方案1】:

如果ForeignKey 是,正如您在ModelB 中描述的那样,并且您执行mb = ModelB.objects.get(pk=prim_id),那么查找modela 属性不是反向查找。您只需通过mb.modela 访问相关对象!

【讨论】:

是的,但我试图做 ModelB.modela_set.all() 来获取 modelB 对 modelA 的引用。我在docs.djangoproject.com/en/dev/topics/db/queries(进行反向查询)的文档中没有注意到 ModelA(文档中的博客)没有指向另一个模型的 ForeignKey 字段。相反,它是 ModelA(博客),它有一个 FOO_set.all() 来自另一个模型的所有引用。我会接受你的答案,因为它仍然是正确的并且可以让其他人找到。

以上是关于Django 通过 ForeignKey 反向查找的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DJango 管理界面中显示 ForeignKey 反向查找列表?

在 Django 模板中过滤反向查找

来自 ForeignKey 的 django 反向关系查询

Django:内置组件Content-Type

Django之跨表查询——正反向查询(ForeignKey)

如何通过django中的多级反向外键获取相关对象查询集?