Bei dem Versuch, eine schnellere Drei-Tabelle für meine eigenen Django-Modelle kommen zu finden, stieß ich auf dieser Frage. Standardmäßig verwendet Django 1.1 INNER JOINs, die bei InnoDB langsam sein können. Für eine Abfrage wie:
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"
Die INNER JOIN kann im Vergleich sehr langsam mit LEFT JOIN:
def event_users(event_name):
return User.objects.filter(roles__events__name=event_name)
Dies könnte die folgende SQL erstellen.Eine noch schnellere Abfrage kann unter gimg1 Antwort zu finden: 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"
Allerdings müssen Sie eine benutzerdefinierte SQL-Abfrage verwenden: https://docs.djangoproject.com/en/dev/topics/db/sql/
In diesem Fall wäre es so etwas wie folgt aussehen:
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()]
Dies ist ziemlich neu in Django (seit 1.0). – zgoda