Есть ли способ объединить с объектами q? - PullRequest
0 голосов
/ 29 марта 2019

Я боролся с этим. Я пытаюсь создать динамический набор запросов, где условия будут основаны на входе пользователя. Пользователь может решить поиск по имени или фамилии или их комбинации. Если поиск выполняется только по фамилии, запрос имени не будет добавлен в набор запросов. В настоящее время он работает для поиска со всеми заполненными полями.

results = documents.objects.filter(
    Q(f_filer__filer_first_name__istartswith=request.GET.get('first_name', 
'')) & (f_filer__filer_last_name__istartswith=request.GET.get('last_name', 
'')) & 
Q(f_office__o_office_name__istartswith=request.GET.get('office_name', ''))
    & Q(f_doc_year__exact=request.GET.get('report_year', ''))
    & Q(f_report_id__exact=request.GET.get('filing_type', ''))       
    ).values('f_filer__filer_first_name',
          'f_filer__filer_last_name',
          'f_office__o_office_name',
          'f_date_received',
          'f_start_travel_date',
          'f_end_travel_date',
          'f_doc_year',
          'f_report__r_title')

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Вы можете просто объединить filter так:

queryset = documents.objects.all()

first_name = request.GET.get('first_name')
last_name = request.GET.get('last_name')

if first_name:
    queryset = queryset.filter(first_name=first_name)
if last_name:
    queryset = queryset.filter(last_name=lastname)

Я сократил аргументы фильтра для упрощения примера

0 голосов
/ 29 марта 2019

Вы можете объединить Q объекты, используя |, который действует как "или":

first_name = request.GET.get('first_name', '')
last_name = request.GET.get('last_name', '')
Q(
    f_filer__filer_first_name__istartswith=first_name,
    f_filer__filer_last_name__istartswith=last_name
) |
Q(f_filer__filer_first_name__istartswith=first_name) |
Q(f_filer__filer_last_name__istartswith=last_name)

Если ваше приложение интенсивно использует поиск, возможно, стоит поискать правильный бэкэнд для поиска.

Вы используете Postgres? Если это так, использование Django Postgres Полнотекстовый поиск , вероятно, упростит ситуацию и поможет сделать код более понятным.

Если вы не используете Postgres, настройка бэкэнда поиска с помощью django-haystack даст вам аналогичные преимущества и позволит пользователям создавать запросы, подобные Google, используя AutoQuery . Например, используя -, чтобы исключить термин и кавычки для точной фразы.

...