如何在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
相关产品推荐
相关产品推荐

