Более подробная информация и разъяснения определенно помогут.
Например:
Event
модель (поможет воспроизвести проблему и даст необходимый фон)
events.query
SQL утверждение (очень полезно)
values_list('event__id')
предполагает, что Event
модель может иметь ForeignKey для себя в сочетании с retrieving event_id's by name
просто добавляет больше разочарования (это может быть действительно на самом деле)
- сколько записей в таблице
events
? 100-1000ms
не очень оптимальное время запроса
Первое, что можно предложить - взгляните на distinct()
.
Чтобы убедиться, что в выбранных столбцах присутствуют только выбранные столбцы и, следовательно, он отличается от одного столбца и более простого плана запроса - четкое упорядочение из QuerySet с empty order_by()
.
events = Events.objects.values_list('event__id', flat=True). \
filter(name__in=names + ['x']).order_by().distinct()
Описание:
С distinct()
Django выполняет SELECT DISTINCT
sql запрос на удаление повторяющихся строк. Примечание duplicate rows
, что означает уникальные строки во всех столбцах SELECT
, а не с уникальными значениями в одном указанном c столбце.
values_list('event__id', flat=True)
на первый взгляд может указывать, что только event_id
присутствует в SELECT
(то есть SELECT DISTINCT event_id FROM events ...
), но это не так - Django просто принимает значения из столбцов, перечисленных в values_list
результата, но SELECT
может содержать любые другие столбцы Django считает, что требуется для запроса .
Таким образом, ваш events.query
может фактически выглядеть как SELECT DISTINCT event_id, col_2, name FROM events ...
, который не только дает различные результаты чем отличается для одного столбца (в некоторых случаях те же результаты, если включен уникальный столбец, например, id
), но также может привести к более сложному плану запроса . Кроме того, col_2
может даже не присутствовать в QuerySet.
Django включает столбцы, которые, по его мнению, необходимы для запуска QuerySet. Т.е. это может быть столбец заказа по умолчанию, установленный на модели - тот, который присутствует, если в QuerySet порядок не установлен.