You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:09:14