tag - import django template
¿Un reverso exterior izquierdo select_related en Django? (5)
A partir de Django 1.4 prefetch_related
hace lo que quieres.
Parent.objects.prefetch_related(''child_set'')
Documentos de Django relacionados (!): https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related .
Imagina el siguiente modelo:
class Parent(Model):
...
class Child(Model)
father = ForeignKey(Parent)
...
Algunos padres tienen hijos, otros no (no son padres en el sentido real, es solo un nombre ficticio).
Me gustaría hacer la siguiente consulta: quiero enumerar a todos los padres , y si tienen hijos, traigan a los niños también . Eso sería el equivalente de una combinación externa izquierda a la tabla secundaria, es decir:
select * from app_parent left join app_child on child_father_id=parent_id
De esta manera, cuando invoco Parent.child_set en mi plantilla, no voy a acceder a la base de datos ni un millón de veces. ¿Hay una manera de hacer eso? Gracias
Creo que estás buscando select_related()
En este caso, creo que lo mejor es hacer una lista de los niños, luego obtener el padre de ellos, así:
children = Child.objects.filter(...).select_related(''parent'').order_by(''parent'')
Luego, en la plantilla, posiblemente utilice un regroup
(tenga en cuenta el order_by
anterior):
{% 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>
Lamento volver a publicar un enlace a mi blog, pero he escrito sobre una técnica para simular relaciones select_relat en relaciones hacia atrás .
en django 1.3
Child.objects.select_related(''father'')
#sql: select * from app_child left join app_parent on child_father_id=parent_id