Mientras trata de encontrar una mesa de tres más rápido se unen para mis propios modelos de Django, me encontré con esta pregunta. De forma predeterminada, Django 1.1 usa INNER JOINs que pueden ser lentas en InnoDB. Para una consulta como:
def event_users(event_name):
return User.objects.filter(roles__events__name=event_name)
esto podría crear el siguiente SQL:
SELECT `user`.`id`, `user`.`name` FROM `user` INNER JOIN `roles` ON (`user`.`id` = `roles`.`user_id`) INNER JOIN `event` ON (`roles`.`event_id` = `event`.`id`) WHERE `event`.`name` = "event_name"
El uniones interiores puede ser muy lento en comparación con LEFT JOIN.Una consulta aún más rápido se puede encontrar en la respuesta de gimg1: Mysql query to join three tables
SELECT `user`.`id`, `user`.`name` FROM `user`, `roles`, `event` WHERE `user`.`id` = `roles`.`user_id` AND `roles`.`event_id` = `event`.`id` AND `event`.`name` = "event_name"
Sin embargo, tendrá que utilizar una consulta SQL personalizada: https://docs.djangoproject.com/en/dev/topics/db/sql/
En este caso, se vería algo como:
from django.db import connection
def event_users(event_name):
cursor = connection.cursor()
cursor.execute('select U.name from user U, roles R, event E' \
' where U.id=R.user_id and R.event_id=E.id and E.name="%s"' % event_name)
return [row[0] for row in cursor.fetchall()]
Esto es bastante nuevo en Django (desde 1.0). – zgoda