Moon
Moon

Reputation: 4160

Django ORM query with exclude not working properly

I have below Django ORM query which excluding product having 0(zero) 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'
)

Above query does not excluding products having 0 sale_price.

But after updating query like below.

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'
)

it working fine.

So my question is why do I need to call exclude 2 times to get desired output.

Thanks.

Upvotes: 3

Views: 3142

Answers (1)

Nafees Anwar
Nafees Anwar

Reputation: 6598

Django by default join multiple conditions with AND operator. Your query will only exclude rows with product__sale_price=0 AND field_value='' AND field_value__isnull=False. If you want OR operator between your conditions, you have to use Q.

from django.db.models import Q


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

Upvotes: 5

Related Questions