Tout en essayant de trouver un pour mes propres modèles Django trois tables plus rapide se joindre, je suis tombé sur cette question. Par défaut, Django 1.1 utilise INNER JOINs qui peut être lent sur InnoDB. Pour une requête comme:
def event_users(event_name):
return User.objects.filter(roles__events__name=event_name)
cela pourrait créer l'instruction SQL suivante:
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"
Le INNER JOIN peut être très lent par rapport à GAUCHE JOIN.Une requête encore plus rapide se trouve sous la réponse 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"
Cependant, vous aurez besoin d'utiliser une requête SQL personnalisée: https://docs.djangoproject.com/en/dev/topics/db/sql/
Dans ce cas, il ressemblerait à quelque chose comme:
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()]
Ceci est assez nouveau dans Django (depuis 1.0). – zgoda