如何获取Django中子模型中存在外键的父模型的所有对象?

Posted

技术标签:

【中文标题】如何获取Django中子模型中存在外键的父模型的所有对象?【英文标题】:How to get all objects of a Parent model of which foreign key exist in child model in Django? 【发布时间】:2016-04-26 20:33:01 【问题描述】:

我有 2 个模型

#models
class Parent(models.Model):
     name = models.CharField()

class Child(models.Model)
     parentLink = models.ForeignKey(Parent)
     timeStamp = models.DateTimeField(auto_now_add=True)

我希望 Parent 模型的所有对象都具有 Child 模型中提到的外键和 timeStamp 字段上的一些过滤器。

我该如何反向获取对象?

mysql 应该是这样的

SELECT Parent.name FROM Parent JOIN Child on Parent.Id = Child.parentLink WHERE Child.timeStamp > '2016-01-01 : 00.00.00'

【问题讨论】:

timeStamp 不是 Prent 的字段。 @Gocht,抱歉打错了。 你的意思是,得到所有属于孩子的父母?有些父母没有孩子? 是的,所有父母都在孩子身上。每个父母都可能有孩子,也可能没有。 @T.Opletal 使用相关的预取,他将获得 Childs。喜欢:Child.objects.filter(timeStamp='some_value').prefetch_related('parentLink'),然后为每个孩子获取父母。 【参考方案1】:

如果我正确理解您的需求,应该是这样的:

Parent.objects.filter(
    child__isnull=False,
    child__timeStamp__gt=datetime.strptime(
        '2016-01-01 00.00.00',
        '%Y-%m-%d %H.%M.%S'
    )
)

这会获取所有Parent 对象,其中有一个时间戳晚于 2016/01/01 的子对象。

【讨论】:

来自文档,"To refer to a “reverse” relationship, just use the lowercase name of the model." 我已经尝试过了,它可以工作(至少在 1.9 中)。 在您的链接示例中,Entry 有一个 Blog 字段,但情况并非如此。 检查以下示例。 :)

以上是关于如何获取Django中子模型中存在外键的父模型的所有对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何清理 Django 孤儿外键值?

django:如何从包含外键的多个模型中制作一个表单

如何在不同的数据库中使用带有外键的 django 模型?

Django外键:获取相关模型?

Python:如何在我的 Django 模板中传递外键的值?

django模型在具有外键的字段中没有列错误