2016-06-10 1 views
0

Я использую backgresql backend в своем приложении Django. Я создаю запрос для диспетчера модели, где у меня есть фильтр с несколькими объектами Q. У меня есть список кортежей, и я хочу один из объектов Q, чтобы быть что-то вроде этого:Можно ли запросить WHERE IN с несколькими полями без использования дополнительного и необработанного sql?

WHERE (id, id2) IN (VALUES (1, 1), (2, 1) ...); 

где значение моего списка кортежей. Похоже, что поиск Django FIELD__in предназначен только для одного поля. Есть ли способ сделать это в одном запросе базы данных, желательно без использования raw sql.

Edit: Использование Django 1.9, PostgreSQL 9.4

ответ

0

Вы можете применить reduce на operator.or_ на Q объект, содержащий как идентификаторы, которые принимает значения из списка кортежей.

import operator 
from functools import reduce 

from django.db.models import Q 

q = reduce(operator.or_, (Q(id=i, id2=j) for i, j in [(1, 1), (2, 1),...])) 

Все кортежи в списке передаются последовательно в Q объекта и присоединился reduce с помощью or.

Вы буквально:

q = Q(id=1, id2=1) | Q(id=2, id2=1) | Q(...) 

 Смежные вопросы

  • Нет связанных вопросов^_^