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

Postgres环境下Django如何过滤JSON字段内嵌数组匹配指定列表的实例

Django Postgres JSON字段数组交集查询正确实现方式

原写法json_field__array_field__in=queryset不生效的核心原因是:Django 中 JSONField 的 __in 查找是判断整个数组是否属于你传入的查询列表,而非判断两个数组是否存在公共元素。

实现方案1:使用Django内置Postgres扩展(推荐,ORM原生写法)

首先导入依赖:

from django.contrib.postgres.fields import ArrayField
from django.contrib.postgres.fields.jsonb import KeyTransform
from django.db import models

然后编写查询语句:

# 假设array_field存储的是整数类型,如果是字符串请把IntegerField改为对应字段类型
target_list = [2, 3] # 你的目标值列表
result = Model.objects.annotate(
    target_array = KeyTransform(
        "array_field", 
        "json_field", 
        output_field=ArrayField(models.IntegerField())
    )
).filter(target_array__overlap=target_list)

这里的__overlap是Postgres专属的查找语法,对应数据库的&&操作符,会返回两个数组存在至少一个公共元素的记录,完全符合你的需求。

实现方案2:使用RawSQL直接调用数据库操作符

如果不想用annotate,也可以直接写原生SQL片段实现,性能和上面的方案一致:

import json
from django.db.models import RawSQL

target_list = [2, 3]
result = Model.objects.filter(
    RawSQL(
        "json_field->'array_field' && %s::jsonb",
        [json.dumps(target_list)]
    )
)

性能优化建议

如果这个查询是高频查询,可以给JSON字段的array_field路径建立GIN索引,查询速度会提升数倍:

-- 直接在数据库执行建索引语句,也可以用Django的迁移实现
CREATE INDEX idx_model_json_array_field ON your_table_name USING GIN ((json_field->'array_field'));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:36:03