Как объединить SearchQuery, используя & оператор в Django Postgres для неопределенных нескольких ключевых слов, приходящих из поля формы - PullRequest
0 голосов
/ 06 мая 2018

У меня есть форма с двумя полями (заголовок, навыки), в которой ключевые слова разделены запятыми. и мы хотим обеспечить поиск всех навыков, используя операторы SearchQuery и '&'. так что если мой search_vector равен SearchVector('job_title',) и предположим, что пользователь ищет Ex. Java, Python, .net как навыки мы можем написать наш запрос что-то вроде ..

PostedJobReq.objects.annotate(search=search_vector).filter(SearchQuery('java') & SearchQuery('python') & SearchQuery('.net')) должен и дает нам результат.

Но в моем случае мы получаем такие ключевые слова, как Ex. Java, python, .net от Formfield так

  1. мы не знаем, сколько ключевых слов будет искать пользователь.
  2. и какими будут эти ключевые слова.

так, как мне предположить объединить несколько SearchQueries вместе, когда я даже не знаю, сколько ключевых слов пользователь будет искать .. Я успешно составил список всех SearchQueries, но я не могу объединить их, используя модуль & в коде.

views.py

enter image description here

complexadvsearch.html Вот так выглядит мой шаблон и содержит форму поиска

enter image description here

Models.py вот так выглядят мои модели: простые названия должностей и некоторые основные навыки, используемые в этом

enter image description here

1 Ответ

0 голосов
/ 06 мая 2018

Вы можете комбинировать объекты SearchQuery () следующим образом:

if filters:
    my_filter = SearchQuery(filters.pop())

    for f in filters:
        my_filter |= SearchQuery(f)

как с объектами Q ():

my_filter = Q()

for f in filters:
    my_filter &= Q(something=f)

, а затем

Stuff.objects.filter(f)

Это действительно классная часть Django ORM.

Но если все ваши условные выражения используют &, вам вообще не нужно использовать объект Q.

Просто сделай:

filter_list = [SearchQuery(i) for i in filters]
Stuff.objects.filter(*filter_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...