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

Django中QuerySet与IntegerField相乘报错:unsupported operand type(s) for *

解决Django子查询结果乘以1000时的类型错误

错误原因

你代码里的sq_1.values('ai_this_year')返回的是QuerySet对象,不是单个数值字段,所以没法直接和整数1000执行乘法运算,这就是触发unsupported operand type(s) for *: 'QuerySet' and 'IntegerField'错误的根源。

解决方案

要在annotate里使用子查询的单个字段值进行运算,需要用Subquery包裹子查询,同时限制子查询只返回单个结果(通过[:1]切片),之后就能正常和整数做乘法,再用Round函数处理。

修改后的完整代码

from django.db.models import Subquery, Round

last_lrpa = LRPA_File.objects.order_by('-file_export_date').first()
last_mou = FileMouPengalihan.objects.order_by('file_export_date').first()

sq_1 = MacroData.objects.filter(macro_file=skai_1.macro.macro_file_1, prk=OuterRef('prk'))
sq_2 = MacroData.objects.filter(macro_file=skai_2.macro.macro_file_1, prk=OuterRef('prk'))
sq_3 = MacroData.objects.filter(macro_file=skai_3.macro.macro_file_1, prk=OuterRef('prk'))
sq_mou = MouPengalihanData.objects.filter(file=last_mou, prk=OuterRef('prk'))
        
lrpa = LRPA_Monitoring.objects.select_related('prk').filter(file=last_lrpa). \
        annotate(
            ai_1 = Round(Subquery(sq_1.values('ai_this_year')[:1]) * 1000),
            aki_1 = Subquery(sq_1.values('aki_this_year')[:1]),
            status_1 = Subquery(sq_1.values('ang_status')[:1]),
            ai_2 = Round(Subquery(sq_2.values('ai_this_year')[:1]) * 1000),
            aki_2 = Subquery(sq_2.values('aki_this_year')[:1]),
            status_2 = Subquery(sq_2.values('ang_status')[:1]),
            ai_3 = Round(Subquery(sq_3.values('ai_this_year')[:1]) * 1000),
            aki_3 = Subquery(sq_3.values('aki_this_year')[:1]),
            status_3 = Subquery(sq_3.values('ang_status')[:1]),
            mou_jan = Subquery(sq_mou.values('jan')[:1]),
            mou_feb = Subquery(sq_mou.values('feb')[:1]),
            mou_mar = Subquery(sq_mou.values('mar')[:1]),
            mou_apr = Subquery(sq_mou.values('apr')[:1]),
            mou_mei = Subquery(sq_mou.values('mei')[:1]),
            mou_jun = Subquery(sq_mou.values('jun')[:1]),
            mou_jul = Subquery(sq_mou.values('jul')[:1]),
            mou_aug = Subquery(sq_mou.values('aug')[:1]),
            mou_sep = Subquery(sq_mou.values('sep')[:1]),
            mou_okt = Subquery(sq_mou.values('okt')[:1]),
            mou_nov = Subquery(sq_mou.values('nov')[:1]),
            mou_des = Subquery(sq_mou.values('des')[:1]),
            sd_1 = Subquery(sq_1.values('sumber_dana')[:1]),
            sd_2 = Subquery(sq_2.values('sumber_dana')[:1]),
            sd_3 = Subquery(sq_3.values('sumber_dana')[:1]),
        )
        
context["lrpa"] = lrpa

关键改动说明

  • 所有子查询的values()调用都用Subquery(...)[:1]包裹,确保返回单个字段值而非QuerySet
  • 乘法运算*1000直接作用在Subquery返回的单个值上,再传入Round函数处理

内容的提问来源于stack exchange,提问作者Andi Fathul Mukminin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:30:55