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

如何在Django中对列表式JSON结构应用查询过滤?

Django PostgreSQL JSONField 列表结构过滤指南

好问题!当你的JSONField存储的是列表结构(比如包含多个对象的数组)时,Django结合PostgreSQL的JSONB能力,提供了几种实用的过滤方式,下面给你逐一说明:

1. 基础匹配:用__contains找列表中的指定对象

如果只是要匹配列表中是否存在某个符合键值对的对象,直接用__contains就够了。比如你要找movies_json_data列表里有rating为4的条目:

# 匹配列表中存在{"rating":4}的记录
Movies.objects.filter(movies_json_data__contains=[{"rating": 4}])

这个查询会返回所有满足条件的Movies实例,只要它的JSON列表里至少有一个对象符合rating:4。

2. 忽略大小写匹配:__icontains

如果你的JSON字符串字段需要忽略大小写(比如review内容),可以用__icontains:

# 匹配列表中存在review包含"horror"(不区分大小写)的对象
Movies.objects.filter(movies_json_data__icontains=[{"review": "horror"}])

3. 复杂条件:用PostgreSQL JSON函数实现精准过滤

如果需要更灵活的条件(比如数值范围匹配、多字段组合),可以借助Django的Func调用PostgreSQL的jsonb_array_elements函数,把JSON数组展开后再过滤:

from django.db.models import Func, F

# 先把JSON数组的每个元素单独提取出来,再筛选rating大于4的记录
Movies.objects.annotate(
    json_element=Func(F('movies_json_data'), function='jsonb_array_elements')
).filter(json_element__rating__gt=4)

这个方法适合处理比如"找列表里有rating大于4的条目"这类场景,能覆盖更复杂的查询需求。

注意事项

  • 留意JSON值的类型:比如你的示例里有rating:4(整数)和rating:"4.5"(字符串),查询时要严格对应类型,否则会匹配失败。比如要找rating为"4.5"的,就得写:
    Movies.objects.filter(movies_json_data__contains=[{"rating": "4.5"}])
    
  • 确保你的项目使用PostgreSQL数据库,并且movies_json_data字段是models.JSONField(Django 3.1+内置,更早版本需要从django.contrib.postgres.fields导入)。

内容的提问来源于stack exchange,提问作者Arbazz Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:36:18