Как использовать 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")
Другие вопросы по тегам