如何使用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
相关产品推荐
相关产品推荐

