Как использовать AND в Django-фильтре?
Как создать фильтр "AND" для извлечения объектов в Django? например, я хотел бы получить строку, которая имеет комбинацию из двух слов в одном поле.
Например, следующий SQL-запрос выполняет именно это, когда я запускаю его в базе данных mysql:
select * from myapp_question
where ((question like '%software%') and (question like '%java%'))
Как вы это делаете в Django с помощью фильтров?
Ответы
Ответ 1
(обновление: этот ответ больше не будет работать и keyword argument repeated
синтаксической ошибки)
mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar")
Обновление: долгое время с тех пор, как я написал этот ответ и выполнил несколько django, но я уверен, что до сих пор лучшим подходом является использование метода объекта Q, как показано здесь Дэвидом Бергером: Как использовать AND в фильтре Django?
Ответ 2
Для удобства, позвольте просто упомянуть метод Q
:
from django.db.models import Q
criterion1 = Q(question__contains="software")
criterion2 = Q(question__contains="java")
q = Question.objects.filter(criterion1 & criterion2)
Обратите внимание, что другие ответы здесь проще и лучше адаптированы для вашего варианта использования, но если кто-то с подобной, но немного более сложной проблемой (например, необходимость "не" или "или" ) видит это, хорошо иметь ссылку прямо здесь.
Ответ 3
Вы можете связать выражения фильтра в Django:
q = Question.objects.filter(question__contains='software').filter(question__contains='java')
Дополнительную информацию в документах Django можно найти в разделе Chaining Filters.