Django ORM-запрос с исключением не работает должным образом - PullRequest
2 голосов
/ 20 марта 2020

У меня ниже Django ORM-запрос, который исключает продукт, имеющий 0 (ноль) sale_price.

selected_attr_values = ProductAttribValue.objects.filter(
    product__status_id=1,
    product_id__in=product_attributes_values.values_list('product_id', flat=True).distinct()
).exclude(
    product__sale_price = 0,
    ifield_value = '',
    field_value__isnull=False
).distinct(
    "field_value",
    'field_id'
).values(
    'field_value',
    'product_id',
    'field__caption',
    'field_id',
    'id'
)

Приведенный выше запрос не исключает продукты, имеющие 0 sale_price.

Но после обновления запроса как показано ниже.

selected_attr_values = ProductAttribValue.objects.filter(
    product__status_id=1,
    product_id__in=product_attributes_values.values_list('product_id', flat=True).distinct()
).exclude(
    field_value='',
    field_value__isnull=False
).distinct(
    "field_value",
    'field_id'
).exclude(
    product__sale_price=0
).values(
    'field_value',
    'product_id',
    'field__caption',
    'field_id',
    'id'
)

все работает нормально.

Итак, мой вопрос, почему мне нужно вызывать exclude 2 раза, чтобы получить желаемый результат.

Спасибо.

1 Ответ

1 голос
/ 20 марта 2020

Django по умолчанию объединяет несколько условий с оператором AND. Ваш запрос исключит только строки с product__sale_price=0 AND field_value='' AND field_value__isnull=False. Если вы хотите оператор ИЛИ между вашими условиями, вы должны использовать Q.

from django.db.models import Q


...exclude(Q(product__sale_price=0) | Q(field_value='') | Q(field_value__isnull=False))
...