Как использовать AND в фильтре Django?
Как создать фильтр "И" для извлечения объектов в Django? Например, я хотел бы получить строку, которая имеет комбинацию двух слов в одном поле.
Например, следующий SQL-запрос делает именно это, когда я запускаю его в базе данных mysql:
select * from myapp_question
where ((question like '%software%') and (question like '%java%'))
Как вы делаете это в Django, используя фильтры?
4 ответа
mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar")
Обновление: долгое время с тех пор, как я написал этот ответ и выполнил несколько django, но я уверен, что до сих пор лучшим подходом является использование метода объекта Q, как показано здесь Дэвидом Бергером: Как использовать AND в фильтре Django?
Ради тщательности, давайте просто упомянуть Q
метод объекта:
from django.db.models import Q
criterion1 = Q(question__contains="software")
criterion2 = Q(question__contains="java")
q = Question.objects.filter(criterion1 & criterion2)
Обратите внимание, что другие ответы здесь более просты и лучше адаптированы для вашего случая использования, но если кто-то с подобной, но немного более сложной проблемой (например, нуждающийся в "не" или "или") видит это, хорошо иметь ссылку прямо здесь.
Вы можете связать выражения фильтра в Django:
q = Question.objects.filter(question__contains='software').filter(question__contains='java')
Вы можете найти больше информации в Django документах на " Chaining Filters".
Вы можете использовать
AND
с фильтром () с использованиемили Q() и
&
как показано ниже:
# "store/views.py"
from .models import Question
from django.db.models import Q
from django.http import HttpResponse
def test(request):
# With "&"
# ↓ Here
qs = Question.objects.filter(question__contains="software") & \
Question.objects.filter(question__contains="java")
print(qs)
# With "Q()" and "&"
# ↓ Here # ↓ Here
qs = Question.objects.filter(Q(question__contains="software") &
Q(question__contains="java"))
print(qs) # ↑ Here
return HttpResponse("Test")