Django Filter逻辑运算问题:特定条件QuerySet返回空集排查
解决Django Q对象查询NULL值返回空的问题
嘿,我之前也踩过这个一模一样的坑!你遇到的问题根本不是Q对象的语法错了,而是Django ORM处理NULL值的逻辑和你想的不一样。
问题根源
你写的models.Q(a="a", b=None)会被Django翻译成SQL里的a = 'a' AND b = NULL,但SQL里的NULL是特殊值,不能用=来判断,必须用IS NULL。所以这条查询条件永远匹配不到任何数据,哪怕数据库里确实有b为NULL的记录。
正确写法
把判断NULL的部分换成__isnull=True就搞定了:
from django.db.models import Q # 正确的查询语句 queryset = cls.objects.filter( Q(a="a", b__isnull=True) | Q(a__isnull=True, b="b") )
排查小技巧
以后再遇到类似问题,可以打印出生成的SQL语句来快速定位:
print(queryset.query)
这样你就能直观看到Django到底生成了什么SQL,一眼就能找出逻辑问题。
内容的提问来源于stack exchange,提问作者ncopiy
相关产品推荐
相关产品推荐

