带有排除功能的 Django ORM 查询无法正常工作

Moo*_*oon 3 django django-orm python-3.x

我有下面的 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'
)
Run Code Online (Sandbox Code Playgroud)

上述查询不排除 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'
)

Run Code Online (Sandbox Code Playgroud)

它工作正常。

所以我的问题是为什么我需要调用排除两次才能获得所需的输出。

谢谢。

Naf*_*war 5

Django 默认使用 AND 运算符连接多个条件。您的查询将仅排除带有product__sale_price=0AND 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))
Run Code Online (Sandbox Code Playgroud)