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

