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

Django JSONField查询报错:operator does not exist: jsonb = bigint

问题解决:Django JSON字段关联统计时类型不匹配错误

错误原因

你遇到的operator does not exist: jsonb = bigint错误,核心是类型不匹配:

  • 表B的preferences__a_id通过双下划线提取后是JSON(jsonb)类型,而表A的id是bigint类型。
  • PostgreSQL没有提供jsonb和bigint直接比较的运算符,直接用preferences__a_id=OuterRef('id')会触发报错。
  • 你之前转换OuterRef(id)没用,因为要转换的是JSON字段提取出的a_id值,而非A表的id。

分场景解决方案

场景1:JSON中的a_id是字符串类型(如"123")

需要把JSON里的字符串a_id转成整数,再和A表的id匹配:

from django.db.models import Count, OuterRef, Subquery, Cast, IntegerField

# 统计每个A对应的B记录数
A.objects.annotate(
    count=Count(
        Subquery(
            B.objects.filter(
                Cast(B.preferences['a_id'], IntegerField()) == OuterRef('id')
            ).values('id')
        )
    )
)

场景2:JSON中的a_id是数字类型(如123)

此时需要把A表的id转成JSON类型,再和JSON字段的a_id匹配:

from django.db.models import Count, OuterRef, Subquery, Cast
from django.db.models.fields.json import JSONField

A.objects.annotate(
    count=Count(
        Subquery(
            B.objects.filter(
                preferences__a_id=Cast(OuterRef('id'), JSONField())
            ).values('id')
        )
    )
)

为什么双下划线在这个场景不生效?

双下划线确实能提取JSON字段的属性,但它只负责提取,不会自动做类型转换。当提取出的JSON类型和要比较的字段类型不兼容时,就需要手动显式转换,否则数据库会因运算符不匹配报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:25:19