Что такое эффективный способ сделать И / ИЛИ Поиск Django-Postgres App?
В моем приложении Django у меня есть модель Publication и модель Tag, которые имеют отношение многие ко многим.
Допустим, у меня есть четыре тега: мужчины, женщины, мода, дизайн. Я хочу найти все публикации, с которыми связан тег ИЛИ ИЛИ женский, И связанный с ним тег ИЛИ модный дизайн. Например, в поле поиска я могу ввести: (мужчины || женщины) && (мода || дизайн). Другими словами, результаты должны давать публикации, в которых есть хотя бы один тег из каждой пары 'или'.
Я выяснил, как выполнить поиск "или" (то есть найти все публикации с тегом "мужчины или женщины", "мода или дизайн"), и выяснил, как выполнить поиск и поиск (т.е. найти все публикации, в которых есть все теги, мужчины и женщины и мода и дизайн), но я не знаю наиболее эффективного способа сделать и / или комбо.
До сих пор я разделил строку запроса, чтобы получить список пар "или", и я начал создавать предикат поиска, но потом подумал, что мне делать с этими результатами? Например...
if 'qTag' in request.GET:
or_queries = request.GET['qTag'].split('&&')
for or_query in or_queries:
or_query_set = or_query.split()
for sub_query in or_query_set:
if pub_predicate:
pub_predicate = pub_predicate | Q(tags__title__istartswith=sub_query)
else:
pub_predicate = Q(tags__title__istartswith=sub_query)
pubs_for_set = Publication.objects.filter(pub_predicate).distinct()
pubs_for_tags.append(pubs_for_set)
pub_predicate = None
pubs_for_set = None
Выполнение вышеизложенного дает мне список (pubs_for_tags) списков (pubs_for_set), который дает все результаты для каждой пары "или". Но что теперь? Я не знаю, как продолжить поиск и поиск. Может кто-нибудь предложить способ сделай это?
2 ответа
Я не уверен, есть ли способ сделать это. Я хотел сказать, попробуйте объединить фильтр с Q, но затем случайно наткнулся на это:
Объединение И ИЛИ в Django Queries
а также
Я думаю, что, возможно, нашел решение своего собственного вопроса. Если у меня есть следующие теги:
query1 = "men"
query2 = "women"
query3 = "fashion"
query4 = "design"
И я хочу найти все публикации, в которых есть мужские ИЛИ женские И ОДЕЖДЫ ИЛИ ОДЕЖДЫ, похоже, это сработает, если я сделаю
pubs = Publication.objects.filter(Q(tags__title__iexact=query1) | Q(tags__title__iexact=query2) and (Q(tags__title__iexact=query3) | Q(tags__title__iexact=query4)))
Посмотрев на этот вопрос: фильтр запросов Django, сочетающий AND и OR с объектами Q, не возвращает ожидаемых результатов, я изменил одно из предложенных решений (которое не было принято), чтобы использовать "и" вместо "&" и его Кажется, работает, хотя я понятия не имею, почему.