Django ORM中与SQL语句field <> 1(含空值排除)等价的写法?
Django ORM 实现与
field <> 1 等价的查询 问题说明
当字段field可为空时,原生SQL语句WHERE field <> 1会同时排除值为1和NULL的行;但Django中使用~Q(field=1)生成的SQL是WHERE (NOT (field = 1 AND field IS NOT NULL)),会将NULL行保留在结果中。需要找到Django ORM中与原生field <> 1等价的写法。
可行方案
有两种直接的写法可以实现完全匹配的逻辑:
链式过滤条件:
Model.objects.filter(field__ne=1, field__isnull=False)该写法生成的SQL为
WHERE field != 1 AND field IS NOT NULL,和原生field <> 1的逻辑完全一致,既排除值为1的行,也排除NULL行。使用
Q对象组合条件(适合复杂查询场景):Model.objects.filter(Q(field__ne=1) & Q(field__isnull=False))效果和链式过滤完全相同,当需要和其他
Q条件组合使用时更灵活。
注意:Django的field__ne查询不会自动排除NULL值,必须显式添加field__isnull=False条件,才能达到原生field <> 1的行为。
内容的提问来源于stack exchange,提问作者masb
相关产品推荐
相关产品推荐

