У меня есть запрос, который нужно извлечь из таблицы, которая точно соответствует требованиям двух столбцов. Поэтому, если у меня есть users таблица со столбцами, age и score.

SELECT * FROM users where (age, score) IN ((5,6), (9,12), (22,44)..);

В моем веб-приложении я получаю эти пары из запроса ajax, и их число может быть довольно большим. Как мне построить запрос для этого в Django?

Я работаю с базой данных Postgres

1
Sai Chander 13 Дек 2019 в 09:57
Здесь та же проблема. Решение @Giorgi будет работать, но я сомневаюсь в его эффективности. Хотя, если у вас короткий список IN, например, 2-4 записи, я думаю, это будет нормально.
 – 
frenzy
30 Дек 2019 в 21:56

1 ответ

Одно из решений, которое я придумал, - использовать django.db.models.Q и создайте точно такой же запрос, как вы написали:

ques = Q(age=5) & Q(score=6) | Q(age=9) & Q(score=12) ...
User.objects.filter(ques)

Это вернет желаемый набор запросов, но я буду обеспокоен размером итераций полученных значений (используя ajax).

С другой стороны, я не помню лучшего решения на данный момент. Если что-то возникнет, обновлю ответ. Надеюсь это поможет.

0
Giorgi Jambazishvili 13 Дек 2019 в 10:11
Он сгенерирует запрос, который будет делать то же самое. Но я сомневаюсь в его эффективности. Например, IN будет использовать index. Это решение - я не уверен.
 – 
frenzy
30 Дек 2019 в 21:40
Верно, я абсолютно согласен, если набор слишком велик, производительность будет проблемой. Но я не вижу лучшего выхода из контекста вопроса, не так ли?
 – 
Giorgi Jambazishvili
31 Дек 2019 в 12:50
Я проверил запрос, сгенерированный этим ответом, с помощью print (queryset.query). Выполняет это с помощью объяснения (например, объясняет, выбирает * из чего-то). Сгенерированное объяснение одинаково для обоих запросов. Итак, я предполагаю, что в этом ответе нет проблем с перфорацией.
 – 
Sai Chander
6 Янв 2020 в 10:04