Джанго комплексный поиск с кваргами - PullRequest
0 голосов
/ 19 декабря 2011

Я пишу представление, которое выполняет поиск в моей базе данных моделей в зависимости от выбранных пользователем полей поиска.Базовый код выглядит примерно так:

def search(request):
if submit in request.POST:
    ...
    kwargs = {}
    if request.POST['field1']:
       kwargs['field1__icontains'] = request.POST['field1']

    if request.POST['field2']:
       kwargs['field2__icontains'] = request.POST['field2']
    ...
    results_list = Mymodel.objects.filter(**kwargs)
    ...

Конечно, это нормально, если мой запрос - все операторы AND, но если мне нужно добавить туда OR - возможно ли это?Например, если мне нужно field2__icontains = request.POST['field2'] ИЛИ field3__icontains = request.POST['field2']

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Создайте объект Q() вместо словаря при работе с полями. Тогда вы можете and и or, как вы хотите.

query = Q()
if request.POST['field1']:
    query &= Q(field1__icontains=request.POST['field1'])
if request.POST['field2'] and request.POST['field3']:
    query &= (Q(field2__icontains=request.POST['field2']) | Q(field3__icontains=request.POST['field3']))
results_list = MyModel.objects.filter(query)
2 голосов
/ 19 декабря 2011

Для создания запроса «ИЛИ» вы можете использовать объекты Q.https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...