Reputation: 4160
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
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