34

次のモデルを想像してください。

class Parent(Model):
    ...

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

子供を持つ親もいれば、子供を持たない親もいます (本当の意味での親ではなく、架空の名前です)。

次のクエリを作成したいと思います。すべての Parentsを一覧表示し、子供がいる場合は子供も連れてきてください。これは、子テーブルへの左外部結合と同等です。つまり、次のようになります。

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

ジャンゴ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 に答える