Django中如何筛选字段为特定值或null的QuerySet
Django QuerySet 筛选「字段为特定值或为null」的实现方法
要实现指定字段匹配特定值、或字段值为null的OR逻辑筛选,必须借助Django ORM的Q对象构建查询条件,不能直接连续调用filter传两个条件——连续传参默认是AND逻辑,会返回空结果。
针对type字段筛选场景(匹配"active"或null)
正确代码写法如下:
# 先导入Q对象 from django.db.models import Q # 假设操作的模型类为你的业务模型类 result_qs = YourModel.objects.filter( Q(type="active") | Q(type__isnull=True) )
关键注意点
- 两个Q对象之间的
|代表逻辑OR关系,如果是逻辑AND用&,条件取反用~,多条件组合时注意用括号控制优先级,避免逻辑错乱。 - 判断字段值为null请统一用
<字段名>__isnull=True的写法,不要直接写type=None。后者在部分数据库、特殊字段类型下会出现匹配异常,__isnull是Django官方推荐的兼容写法。 - 如果是需要匹配多个特定值+null的场景(比如type为active、pending,或者为null),可以结合
__in扩展写法:result_qs = YourModel.objects.filter( Q(type__in=["active", "pending"]) | Q(type__isnull=True) )
常见错误写法避坑
不要写成下面这种形式,两个条件默认做AND拼接,相当于要求type同时等于"active"且为null,永远返回空查询集:
# 错误写法:逻辑为AND,结果为空 wrong_qs = YourModel.objects.filter(type="active", type__isnull=True)
内容的提问来源于stack exchange,提问作者th3plus
相关产品推荐
相关产品推荐

