Django 3.2与4.0中JSONField null值查询结果差异问题咨询
Django JSONField跨版本查询行为差异问题
测试基础配置
定义包含JSONField字段的测试模型:
class Event(models.Model): data = models.JSONField()
预先写入两条测试数据,二者核心差异为data.key的存储值类型:
# key对应值为JSON原生null event1 = Event.objects.create(data={"key": None}) # key对应值为内容是null的普通字符串 event2 = Event.objects.create(data={"key": "null"})
不同版本查询表现
Django 3.2.13版本
执行两类查询时可以精准匹配对应类型的记录,每条查询仅返回1条符合语义的结果:
Event.objects.filter(data__key=Value("null")) # 返回结果:[event1] Event.objects.filter(data__key="null") # 返回结果:[event2]
该版本下查询语义边界清晰:用Value()包裹传值时,匹配JSON原生null类型;直接传入Python字符串时,匹配字符串类型的"null"值,不存在类型混淆问题。
Django 4.0.5版本
执行完全相同的两条查询语句时,两条语句都会同时返回event1、event2两条记录,无法区分JSON原生null值和内容为"null"的字符串值。
结论
目前Django官方文档没有明确标注该场景下的预期返回规则,从实际使用的语义逻辑判断,3.2版本的返回结果符合框架设计预期:JSONField的查询本该和传入值的类型严格匹配,不该把JSON原生null和内容为null的字符串混为一谈。4.0版本的该表现属于版本迭代带来的功能回归Bug,对应问题已经提交到Django官方Bug追踪平台跟进。
内容的提问来源于stack exchange,提问作者Johnny Metz
相关产品推荐
相关产品推荐

