排除的 Django ORM 查询无法正常工作
Django ORM query with exclude not working properly
我有以下 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 次才能获得所需的输出。
谢谢。
Django 默认使用 AND 运算符连接多个条件。您的查询将仅排除包含 product__sale_price=0
AND field_value=''
AND field_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))
我有以下 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 次才能获得所需的输出。
谢谢。
Django 默认使用 AND 运算符连接多个条件。您的查询将仅排除包含 product__sale_price=0
AND field_value=''
AND field_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))