带有exclude的Django ORM查询无法正常工作



我在下面的Django ORM查询中排除了销售额为0(零(的产品。

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

上述查询不排除sale_price为0的产品。

但更新后的查询如下。

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两次才能获得所需的输出。

谢谢。

Django默认使用AND运算符联接多个条件。您的查询将仅排除具有product__sale_price=0ANDfield_value=''ANDfield_value__isnull=False的行。如果要在条件之间使用OR运算符,则必须使用Q
from django.db.models import Q

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

最新更新