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

Posted

技术标签:

【中文标题】带有排除的 Django ORM 查询无法正常工作【英文标题】:Django ORM query with exclude not working properly 【发布时间】:2020-07-01 13:50:41 【问题描述】:

我有以下 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 的产品。

但是在更新如下查询之后。

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

谢谢。

【问题讨论】:

【参考方案1】:

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 查询无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM。如何排除旧数据?

运行带有排除项的宏多张工作表

在 Django 的 ORM 中使用带有 UPDATE 的子查询

Django ORM查询无法选择新对象

Django进阶-ORM框架的一般操作

如果找到湮灭对,Django ORM 排除结果