LINUX.ORG.RU

django bulk select

 ,


0

1

Есть несколько записей. Известны два их поля. Нужно найти записи, у которых первое поле совпадает, а второе нет. Как это сделать одним запросом в джанговский фильтр? Пока не приходит в голову ничего лучше, чем делать кучу «field1 = x and field2 != y» но наверное это будет медленно?

★★★★★

Жахни raw-запрос

Siado ★★★★★
()
Ответ на: комментарий от anonymous

У меня есть список данных:

(1, 2), (5, 7), (6, 9)

Тут в скобочках то, что нужно подставить в field1 и field2. Как мне в одном запросе получить то что ты выше написал для всех пар сразу?

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

Тебе нужно чтобы запрос вернул записи для каждой пары значений, или записи, удовлетворяющие всем парам значений?

pi11 ★★★★★
()
Ответ на: комментарий от vurdalak

генерируй любым способом Q-выражение (например, через reduce) со всеми field1 и field2:

q = (Q(field1=a1) & ~Q(field1=b1)) | (Q(field1=a2) & ~Q(field1=b2)) .. | (Q(field1=an) & ~Q(field1=bn))
только убедись, что проходишь по числу параметров в БД.

anon1984
()
Ответ на: комментарий от anon1984

а кошерно решать такие задачи помещая список во временную таблицу, и в запросе использовать where (field1, field2) in (select f1, f2 from tmpT), но это уже не к django orm

anon1984
()
Ответ на: комментарий от vurdalak

Тогда быстрее будет развернуть эти пары значений в 2 списка и -

Q(field1__in=[1,5,6]) & ~Q(field2__in=[2,7,9])

или можно = filter(field1__in=[1,5,6]).exclude(field2__in=[2,7,9])

pi11 ★★★★★
()
Ответ на: комментарий от pi11

нужно именно «field1=1 И field2!=2», а у тебя «вылетят» записи где field1=1 и field2 = 7, 8 или 9, что неверно.
смотри выше мой вариант, правда там опечатка, (должно быть ~Q(field2=bn)), но это чтоб жизнь медом не казалась

anon1984
()
Ответ на: комментарий от pi11

Не вариант. У тебя в вывод не попадут поля, у которы field1=1, а field2=9.

vurdalak ★★★★★
() автор топика

<trollmode on>

ЖАНГА ЖЕ ОТЛИЧНЫЙ ФРЕЙМВОРК

</trollmode off>

ggrn ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.