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

Django REST Framework返回指定字段报错:'int' object has no attribute 'pk'

问题原因与解决方案

错误原因

你调用values()方法后,返回的是包含字典的QuerySet,而你的VAndISerializer继承自ModelSerializer,这类序列化器是为处理模型实例设计的,会尝试访问实例的pk属性,但字典中的id是整数类型,没有pk属性,因此触发'int' object has no attribute 'pk'错误。

解决方案(推荐第一种)

方案1:移除values(),利用序列化器指定字段

你的VAndISerializer已经通过Meta.fields指定了需要返回的字段,直接用模型实例QuerySet即可,序列化器会自动过滤出指定字段:

修改APIView代码:

class VAndI(APIView):
    def get(self, request):
        # 移除values(),直接取模型实例的前5条最新数据
        queryset = PowerMeter.objects.all().order_by('-id')[:5]
        serializer = VAndISerializer(instance=queryset, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

方案2:改用普通Serializer处理字典数据

如果坚持要用values()返回字典,需要将序列化器改为继承自serializers.Serializer,手动定义对应字段(字段类型需与模型一致):

修改序列化器代码:

class VAndISerializer(serializers.Serializer):
    id = serializers.IntegerField()
    meter_id = serializers.CharField()  # 根据PowerMeter模型中meter_id的实际类型调整,比如IntegerField
    State = serializers.CharField()
    date = serializers.DateTimeField()
    VII1 = serializers.FloatField()  # 根据模型字段类型调整,比如DecimalField
    VII2 = serializers.FloatField()
    VII3 = serializers.FloatField()
    VII_avg = serializers.FloatField()

APIView代码保持不变即可,此时序列化器会直接处理字典数据,不会再尝试访问模型实例的属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:40:09