想象一下以下模型:
class Parent(Model):
...
class Child(Model)
father = ForeignKey(Parent)
...
有些父母有孩子,有些则没有孩子(他们不是真正意义上的父母,只是一个虚构的名字)。
我想提出以下问题:我想列出所有家长,如果他们有孩子,也会带孩子。这相当于Child表的左外连接,即:
select * from app_parent left join app_child on child_father_id=parent_id
这样,当我在模板中调用 Parent.child_set 时,我不会在数据库中遇到数十亿次。有没有办法做到这一点? 感谢
答案 0 :(得分:21)
从Django 1.4开始prefetch_related
做你想要的。
Parent.objects.prefetch_related('child_set')
相关(!)django docs:https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related。
答案 1 :(得分:13)
很抱歉再次发布我的博客的链接,但我写了一个模拟select_related on backwards relationships的技术。
答案 2 :(得分:6)
在这种情况下,我认为最好的办法是列出孩子,然后从他们那里得到父母,就像这样:
children = Child.objects.filter(...).select_related('parent').order_by('parent')
然后在模板中,可能会使用regroup
(请注意上面的order_by
):
{% regroup children by parent as parents %}
<ul>
{% for parent in parents %}
<li>{{ parent.grouper }}
<ul>
{% for child in parents.list %}
...
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
答案 3 :(得分:0)
在django 1.3
Child.objects.select_related('father')
#sql: select * from app_child left join app_parent on child_father_id=parent_id
答案 4 :(得分:-7)
我认为您正在寻找select_related()