febrero 15, 2012

Referencia cruzada en Django

Django está diseñado para nuestra comodidad, si bien algunas veces se hace dificil encontrar exactamente lo que necesitamos, este es el caso de las referencias cruzadas:

En el caso de tener un campo ForeignKey o ManyToManyField existen ocasiones en que queremos seguir esta relación para obtener los campos relacionados de la otra, un ejemplo que me ha sucedido recientemente es que al hacer uso del objeto de paginacion (Paginator) si quieres obtener las referencias necesitas realizar otra consulta (en un bucle for por ejemplo) con el objeto final que quieres mostrar, esto provocaba que la optimización del paginator (solo se trae los registros a mostrar) se fuera a paseo obligando a procesar toda la tabla y hacer n bucles mas con la tabla que nos interesa. Esto se resuelve haciendo uso del objeto referencia RelatedManager.

Imaginando que tenemos un objeto llamado cesto y un objeto llamado peras que tiene como foreingkey un cesto si queremos localizar las peras del cesto de esta forma llamariamos a pera.cesto_set.all()
Esto es muy útil pues podemos delegar esta parte de la lógica en la plantilla consiguiendo una aplicación bastante mínima:
{% for pera in peras %}
  {{ pera.tipo }}
    {% for cesto in pera.cesto_set.all %}
       {{ cesto.nombre }}
    {% endfor %}
{% endfor %}

comentarios: