You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Django ORM排除字段的多个指定值?

解决Django ORM排除多值的查询问题

我来帮你搞定这个ORM查询的坑——你遇到的问题核心是错误的exclude条件写法,导致过滤逻辑根本没生效。

你原来写的mytable.objects.exclude(name = ['','-'])不符合Django ORM的语法规则:Django不支持直接用等于号=匹配列表来排除多值,这种写法会被ORM错误解析,最终生成的SQL没有包含有效的过滤条件,所以才返回了全部2000行数据。而单独exclude(name = '')能正常工作,是因为单值的相等匹配是ORM支持的标准写法。

下面是两种正确的解决方案,都能和你的PostgreSQL原生查询逻辑完全对齐:

方案1:使用__in查询排除多值

这是最简洁的写法,直接指定要排除的值列表:

mytable.objects.exclude(name__in=['', '-']).order_by('name').count()

这个写法会生成等价于NOT (name IN ('', '-'))的SQL,和你原生查询的过滤逻辑一致。

方案2:链式调用多个exclude

如果你更倾向于和原生SQL的AND逻辑完全对应,可以分开两次调用exclude:

mytable.objects.exclude(name='').exclude(name='-').order_by('name').count()

这种写法生成的SQL是name != '' AND name != '-',和你手动编写的原生查询完全匹配。

任选其中一种写法,就能得到你预期的1450条结果了。

内容的提问来源于stack exchange,提问作者Moon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:57:37