Фильтрация кверисетов в Django не обеспечивает ожидаемого поведения

У меня есть приложение, принимающее входные данные от пользователя на лицевой стороне.

Функциональность, которую я пытаюсь реализовать, должна отображать на переднем плане все названия, которые имеют отзывы <=0, или отображать значения NULL в базе данных.

 reviewsign_high = 'lte'
 if reviewinput_high == '0':
        review_kwargs = {
                'amz_reviews__isnull': True,
                'amz_reviews__{}'.format(reviewsign_high): float(reviewinput_high)
            }

        titles = titles.filter(**review_kwargs)

Однако здесь я не получаю никаких результатов. Если я удалю один параметр, т.е. 'amz_reviews__isnull': True, я получу все названия с отзывами меньше или равными 0.

И наоборот, если я удалю 'amz_reviews__{}'.format(reviewsign_high): float(reviewinput_high), я получу все названия с NULL рецензиями. Но все вместе они выдают 0 результатов. Есть идеи по решению этой проблемы? Спасибо!

Множественные фильтры в ORM Django по умолчанию используют 'AND' при генерации SQL. Вам следует рассмотреть возможность использования объекта Q для задания запроса 'OR'. https://docs.djangoproject.com/en/3.2/topics/db/queries/#complex-lookups-with-q-objects

from django.db.models import Q
titles = titles.filter(Q(**review_kwargs, _connector=Q.OR))
Вернуться на верх