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

