Utilizar el ORM de Django de la forma correcta


En este post explicaré como utilizar Django de la forma correcta. Porque si no nos damos cuenta, y lo utilizamos como queramos, acabaremos haciendo webapps con cientos de consultas al base de datos, y lo único que hace falta para optimizarlo son un par de líneas de código.

Vamos a empezar con el ejemplo que más veo que falla la gente:

 
centros = Centro.objects.filter(user=request.user)
for c in centros:
    print c

Este pedazo de código genera 1 consulta SQL.
Ahora vamos ha hacer un print del email del usuario que es propietario del centro.

 
centros = Centro.objects.filter(user=request.user)
for c in centros:
    print c.user.email

Este código genera 150 peticiones SQL! Y porque solo hay 150 centros con ese usuario, las peticiones que puede llegar a tener son muchas más.
En cada iteración del loop “for c in centros“, se está haciendo la misma sub-consulta para ver el email.
Esto es optimizable solo añadiendo lo siguiente:

 
centros = Centro.objects.filter(user=request.user).select_related('user')
for c in centros:
    print c.user.email

En este caso, gracias al select_related, hemos reducido de más de 150 consultas a tan solo 1.
Lo que hace el select_related es hacer un JOIN de la tabla User.

Esta simple función puede ahorrarnos cientos de consultas.

Iré actualizando el post añadiendo nuevas técnicas y usos avanzados del ORM a medida que tenga tiempo.

You may also like

LEAVE A COMMENT