Джанго Хейстек. А или в поисковом наборе

Использование: Хейстек и Сорл.

Мне нужно сделать набор поисковых запросов для поиска товаров по фильтру.

Во-первых, мне нужно фильтровать только продукты, основанные на моем сайте (структура сайта Django). Итак, я делаю:

sqs = sqs.filter(site=site.pk)

Возвращает такой поисковый запрос:

site:(6)

ХОРОШО.

Тогда мне нужно отфильтровать по атрибутам:

sqs = sqs.filter(attribute_codes='power', attribute_values__range=(20, 30))
sqs = sqs.filter(attribute_codes='power', attribute_values__range=(40, 50))

И это генерирует такой запрос:

(site:(6) AND attribute_codes:(power) AND attribute_values:(["20" TO "30"]) AND attribute_values:(["40" TO "50"]))

Но мне нужно сделать такой запрос:

(site=6) AND ((attributes1) OR (attributes2))

Поэтому я попытался изменить фильтрацию по атрибутам на filter_or:

 sqs = sqs.filter_or(attribute_codes='power', attribute_values__range=(20, 30))
sqs = sqs.filter_or(attribute_codes='power', attribute_values__range=(40, 50))

И результат:

(site:(6) OR (attribute_codes:(power) AND attribute_values:(["20" TO "30"])) OR (attribute_codes:(power) AND attribute_values:(["40" TO "50"])))

Но мне нужно еще:

    (site=6) AND ((attributes1) OR (attributes2))

Итак, как это сделать? Помоги мне, пожалуйста

1 ответ

Решение

Как набор запросов Django Q объект, сено Джанго имеет SQ объект, который позволяет использовать | а также & операторы в фильтрации

sqs = sqs.filter(site=6)
sqs = sqs.filter(SQ(attribute_codes='power') | SQ(attribute_values__range=(20, 30))

или же

sqs = sqs.filter(
    SQ(site=6) & (SQ(attribute_codes='power') | SQ(attribute_values__range=(20, 30))
)
Другие вопросы по тегам