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

