Как правильно создать Django QuerySet, где какое-то поле имеет значения в списке? - PullRequest
0 голосов
/ 16 января 2012

У меня есть куча объектов виджетов.

Теперь у каждого виджета есть строковое свойство с именем 'foo'.И мне нужно иметь возможность запрашивать виджеты, у которых для 'foo' установлено значение 'красный', 'оранжевый', 'зеленый' или любой другой цвет, и включать только виджеты, которые имеют соответствующее свойство 'foo'.Кроме того, эти цвета исходят от пользовательского ввода, поэтому я не могу им доверять.Я бы предпочел не загружать все результаты и затем фильтровать их, а делать это в SQL.

Однако… Я вижу только способы объединения предложений с «И», но не «ИЛИ».А «in» - это мусор («in» работает только с числовыми идентификаторами или подзапросом, который сводится к той же проблеме!).Я пробовал некоторые другие вещи, но они, похоже, не работали.

По сути, я спрашиваю, как выразить это как ключ filterQuery ниже.

myNiceWidgets = Widget.objects.filter(**filterQuery).orderBy(...)

Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 января 2012

Чтобы использовать OR, посмотрите на Q объекты Джанго.

https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Widget.objects.filter(Q(foo='red') | Q(foo='green'), **filterQuery)

Он не будет работать как ключ filterQuery как Qобъект должен быть позиционным аргументом.

Функции поиска могут смешивать использование объектов Q и аргументов ключевых слов.Все аргументы, предоставляемые функции поиска (будь то ключевые аргументы или объекты Q), объединяются в единицу «И».Однако, если предоставляется объект Q, он должен предшествовать определению любых аргументов ключевого слова.Например:

2 голосов
/ 16 января 2012

Это:

'in' работает только с числовыми идентификаторами или с подзапросом

это ерунда. in в порядке со списком имен:

Widget.objects.filter(foo__in=['red', 'orange', 'green', 'blue'])
0 голосов
/ 16 января 2012

Спасибо за ваши ответы!

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

...