Ответ 1
Начиная с Django 1.4 prefetch_related
делает то, что вы хотите.
Parent.objects.prefetch_related('child_set')
Связанные (!) django docs: https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related.
Представьте себе следующую модель:
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 в моем шаблоне, я не буду ударять по базе данных в разы. Есть ли способ сделать это? Благодаря
Начиная с Django 1.4 prefetch_related
делает то, что вы хотите.
Parent.objects.prefetch_related('child_set')
Связанные (!) django docs: https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related.
Извините, что еще раз разместил ссылку на свой блог, но я написал о методе моделирования select_related по обратным отношениям.
В этом случае я считаю, что лучше всего перечислить дочерние элементы, а затем получить от них родительский элемент:
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>
в django 1.3
Child.objects.select_related('father')
#sql: select * from app_child left join app_parent on child_father_id=parent_id
Я думаю, что вы ищете select_related()