2015-07-16 3 views
3

Я пытаюсь использовать ORM Django для генерации запроса с использованием как дополнительных, так и фильтрующих методов. Что-то вроде этого:Django OR query using Extra и Filter

Model.objects.filter(clauseA).extra(clauseB).all() 

Это генерирует запрос, но проблема в том, что все в предложении фильтра AND'd со всем в дополнительной статье, так что SQL выглядит следующим образом:

SELECT * FROM model WHERE clauseA AND clauseB. 

Мой вопрос, есть ли способ изменить оператор комбинированного по умолчанию для запроса в Django таким образом, что запрос будет генерироваться:

SELECT * FROM model WHERE clauseA OR clauseB. 
+2

Вы просто ищете [или запрос?] (Http://stackoverflow.com/questions/739776/django-filters-or) (Возможный дубликат) – Sayse

+0

Нет, это работает только для аргументов в методе фильтрации. Мне нужно изменить комбинатор по умолчанию, так что то, что возвращается из метода 'extra()', является OR'd для того, что возвращается из метода 'filter()' (вместо AND'd, как это сейчас). То, что у меня есть в дополнительном методе, - это родной SQL, который не может быть представлен в ORM Django и не может быть завершен с помощью 'Q' – jcern

+0

. Это' Model.objects.filter (Q (clauseA) | Q (clauseB)).() 'недействительным решением? Я не понимаю, почему вам нужен отдельный вызов (из моего собственного тестирования этот фильтр, показанный здесь, будет генерировать желаемый SQL-вывод). Я уверен, что возможно изменить комбинатор по умолчанию, но я бы не советовал его – Sayse

ответ

3

Попробуйте Q object

Model.objects.filter(Q(clauseA) | ~Q(clauseB)) 

EDIT

попробовать это

Model.objects.filter(clauseA) | Model.objects.extra(clauseB) 
+1

Спасибо, редактирование было именно тем, что я искал. Я не знал, что вы можете использовать методы 'extra' и' filter' с '&' и '|'. – jcern

0

Это может быть проще, если вы просто избавиться от пункта фильтра и включить этот фильтр непосредственно в дополнительный OR-нут с вашей Postgres специфической функции. Я думаю, что это уже ограничение Django ORM.

Вы можете попытаться создать свой собственный Func expression. После того, как вы создали один для своей конкретной функции Postgres, вы можете использовать комбинацию объектов Func(), F() и Q(), чтобы избавиться от этой неприятной функции .extra() и цепочки их красиво.