При попытке найти более быстрый три стола присоединиться для моих собственных моделей Django, я наткнулся на этот вопрос. По умолчанию Django 1.1 использует INNER JOINs, который может замедляться на InnoDB. Для запроса типа:
def event_users(event_name):
return User.objects.filter(roles__events__name=event_name)
это может создать следующий 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"
внутренние объединения может быть очень медленным по сравнению с ЛЕВЫЙ соединениями.Еще быстрее запрос может быть найден в ответ 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"
Однако, вам нужно будет использовать пользовательские SQL-запрос: https://docs.djangoproject.com/en/dev/topics/db/sql/
В этом случае, это будет выглядеть примерно так:
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()]
Это совершенно новое в Django (начиная с версии 1.0). – zgoda 2008-09-17 10:05:13