如何获取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中子模型中存在外键的父模型的所有对象?的主要内容,如果未能解决你的问题,请参考以下文章