Подтвердить что ты не робот

Левый внешний обратный select_related в Django?

Представьте себе следующую модель:

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 в моем шаблоне, я не буду ударять по базе данных в разы. Есть ли способ сделать это? Благодаря

4b9b3361

Ответ 3

В этом случае я считаю, что лучше всего перечислить дочерние элементы, а затем получить от них родительский элемент:

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>

Ответ 4

в django 1.3

Child.objects.select_related('father')
#sql: select * from app_child left join app_parent  on child_father_id=parent_id