Два или более __in фильтров в наборе запросов django - PullRequest
2 голосов
/ 05 января 2011

У меня есть этот запрос

query = 'select * from products where (productnr, supplier_id) in (%s)' % product_list

, где product_list выглядит следующим образом ((OB520, 3), (RH402, 20) ...)

Как мне сделать это в Django, используя набор запросов и фильтр __in

Ответы [ 2 ]

7 голосов
/ 05 января 2011

Какая часть этого сбивает с толку?http://docs.djangoproject.com/en/1.2/ref/models/querysets/#in Кажется, очень ясно.

Из вопроса не совсем понятно, в чем проблема.

Вы спрашиваете, как использовать многокомпонентный ключ?Если это так, вы будете недовольны простым __in.

Если вы пытаетесь найти «ИЛИ» ключа из двух частей, вам нужно создать более сложное условие.

Начните здесь: http://docs.djangoproject.com/en/1.2/topics/db/queries/#complex-lookups-with-q-objects

from django.db.models import Q
product_list.filter(
Q(productnr='OB520', supplier_id=3) | Q(productnr='RH402', supplier_id=20))

Если вы пытаетесь выполнить поиск с несколькими ключами, это именно тот способ, которым он должен работать.

Или проблема в том, что в предложении "in" содержится длинный список определенных значений?

Если у вас длинный список, вы можете составить запрос по частям.

q_obj= Q()
for p, s in some_list_of_pairs;
   q_obj |= Q(productnr=p, supplier_id=s )
product_list.filter(q_obj)

Выше не проверено.Кроме того, это, вероятно, неэффективно.

Что лучше, это что-то вроде этого.

def values_iter( some_list_of_pairs ):
    for p, s in some_list_of_pairs
        yield product_list.get(productnr=p, supplier_id=s) 

Это позволит выполнить несколько очень эффективных поисков SQL по одному.Это может выполняться быстрее, чем создание сложного многоключевого предложения IN.

1 голос
/ 20 февраля 2014

Разделите запятую в запросе.

Пример:

?groups__in=1,2

Иногда лучше ответить на вопрос, чем спорить о том, что он является допустимым вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...