Что такое эффективный способ сделать И / ИЛИ Поиск 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

а также

И ИЛИ в запросах Django II

Я думаю, что, возможно, нашел решение своего собственного вопроса. Если у меня есть следующие теги:

        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, не возвращает ожидаемых результатов, я изменил одно из предложенных решений (которое не было принято), чтобы использовать "и" вместо "&" и его Кажется, работает, хотя я понятия не имею, почему.

Другие вопросы по тегам