34

想象以下模型:

class Parent(Model):
    ...

class Child(Model)
    father = ForeignKey(Parent)
    ...

有些父母有孩子,有些则没有(他们不是真正意义上的父母,只是一个虚构的名字)。

我想进行以下查询:我想列出所有的父母,如果他们有孩子,也给我带来孩子。这相当于对子表的左外连接,即:

select * from app_parent left join app_child on child_father_id=parent_id

这样,当我在模板中调用Parent.child_set时,我不会多次访问数据库。有没有办法做到这一点?谢谢

4

4 回答 4

24

从 Django 1.4 开始prefetch_related做你想做的事。

Parent.objects.prefetch_related('child_set')

相关(!)django 文档:https ://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related 。

于 2012-06-30T10:38:11.687 回答
7

在这种情况下,我认为最好的办法是列出孩子,然后从他们那里得到父母,就像这样:

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>
于 2010-09-21T18:43:57.673 回答
0

在 django 1.3 中

Child.objects.select_related('father')
#sql: select * from app_child left join app_parent  on child_father_id=parent_id
于 2011-09-03T21:59:21.217 回答
-7

我认为您正在寻找select_related()

于 2010-06-04T16:27:43.070 回答