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

如何在Django中对存储列表的JSONField执行字符串包含过滤

Django JSONField列表元素包含子串筛选方案

你定义的是存储字符串列表的JSONField,要筛选列表中任意元素包含N05的记录,可根据你使用的数据库选择对应实现:

方法1:PostgreSQL数据库(最优方案)

PostgreSQL对JSON类型原生支持最好,可通过展开数组元素实现精准匹配:

from django.db.models import F, Func

# 若你用的是json类型而非jsonb类型,将function参数改为json_array_elements
mymodel.objects.annotate(
    atc_element=Func(F('atc_code'), function='jsonb_array_elements')
).filter(
    atc_element__icontains='N05'
).distinct()

该方案不会误命中JSON结构字符,性能优异,数据量大时可给atc_code字段建GIN索引进一步提速。

方法2:全数据库兼容简易方案

如果使用MySQL、SQLite等数据库,可直接将JSON字段转为字符串后模糊匹配:

mymodel.objects.filter(atc_code__str__icontains='N05')

该方案写法极简,仅在你要搜索的子串与JSON序列化结构字符(如"、[、])重合时可能出现误判,普通场景下完全可用。

方法3:MySQL数据库专用方案

MySQL可通过内置JSON_SEARCH函数实现精准匹配:

from django.db.models import F, Func, Value

mymodel.objects.filter(
    Func(
        F('atc_code'), Value('one'), Value('%N05%'),
        function='JSON_SEARCH'
    )__isnull=False
)

补充说明

  • 需要大小写敏感匹配时,把icontains替换为contains即可
  • 若仅需匹配元素前缀为N05的场景,可将对应匹配规则调整为startswith/istartswith

内容的提问来源于stack exchange,提问作者Gurkenkönig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:45:05