首页 > 解决方案 > 姜戈 | 字段 'id' 需要一个数字,但得到 OrderedDict()

问题描述

我在 restframework 中有一个创建端点,可以正常工作。
意见如下

class ItemAddAPIView(CreateAPIView):
    serializer_class = ItemSerializer
    parser_classes = [MultiPartParser]

    def create(self, request, *args, **kwargs):
        try:
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            item_obj = Item.objects.create(title=serializer.data['title'],
                            discount=serializer.data['discount'],
                            rate_per_kg=serializer.data['rate_per_kg'])
            return Response(serializer.data, status=HTTP_201_CREATED)
        except Exception as e:
            print("error :: ",e)

序列化程序如下:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields='__all__'

这工作正常。但是当我将 SerializerMethodField() 添加到 Serializer 时,它会给出错误:

字段 'id' 需要一个数字,但得到 OrderedDict([('title', 'erwre'), ('rate_per_kg', 53.0), ('discount', 5.0)])。

class ItemSerializer(serializers.ModelSerializer):
    images = serializers.SerializerMethodField(method_name='get_image_list')
    class Meta:
        model = Item
        fields='__all__'

    def get_image_list(self,obj):
        image_list=[]
        item_images = ItemImage.objects.filter(item=obj)
        request = self.context.get('request')
        for each in item_images:
            image_list.append(request.build_absolute_uri(each.image.url))
        return image_list

标签: pythondjangopython-3.xdjango-rest-framework

解决方案


class ItemSerializer(serializers.ModelSerializer):
    images = serializers.SerializerMethodField(method_name='get_image_list')
    class Meta:
        model = Item
        fields='__all__'

    def get_image_list(self,obj):

传递给参数的obj参数不是实际Item object的,它是传递给视图中的序列化程序的字典。即serializer = self.get_serializer(data=request.data)。如果您进行更新,这会很好用,然后您可以通过Item objectieserializer = self.get_serializer(item, data=request.data)

image_list=[]
item_images = ItemImage.objects.filter(item=obj)
request = self.context.get('request')
for each in item_images:
    image_list.append(request.build_absolute_uri(each.image.url))
return image_list

obj传递给方法的参数get_<field>应该是模型对象,否则调用serializer.is_valid(raise_exception=True)将失败导致该错误。


推荐阅读