Фильтрация кверисетов в 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))