如何修复 Django REST Framework 中的 UnicodeDecodeError?

Nat*_*han 5 python django django-views django-rest-framework

我想ProductImageSerializer在可浏览的 API 中显示。但我收到了这个错误:

UnicodeDecodeError at /api/product_images/
'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Unicode 错误提示
无法编码/解码的字符串是: ??????

这是我的models.py

class ProductImage(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='product_images', width_field=None, height_field=None,
                              max_length=250)
    default = models.BooleanField(verbose_name='Default Picture', default=False)

    def __str__(self):
        return '%s - %s' % (self.product.product_id, self.default)
Run Code Online (Sandbox Code Playgroud)

这是我的serializers.py

class ProductImageSerializer(serializers.ModelSerializer):
    product = serializers.PrimaryKeyRelatedField(many=False, queryset=Product.objects.all())

    class Meta:
        model = ProductImage
        fields = ['id', 'product', 'image', 'default']

    def to_representation(self, instance):
        if self.context['request'].method == 'GET':
            product = ProductSerializer(instance.product, many=False, context=self.context).data
            data = {
                'id': instance.id,
                'product': product,
                'image': instance.image,
                'default': instance.default,
            }
            return data
        return Serializer.to_representation(self, instance)
Run Code Online (Sandbox Code Playgroud)

这是我的views.py

class ProductImageView(viewsets.ModelViewSet):
    queryset = ProductImage.objects.all()
    serializer_class = ProductImageSerializer
Run Code Online (Sandbox Code Playgroud)

我认为从我在几个 StackOverflow 帖子上搜索的内容来看,问题是由于该image领域而发生的。

这是我imageto_representation函数中删除字段时的屏幕截图serializers.py

在此处输入图片说明

我应该添加或编辑什么ProductImageSerializer才能image正确显示该字段?

Moh*_*eed 8

尝试

instance.image.url instead of instance.image 
Run Code Online (Sandbox Code Playgroud)

和完整的网址使用

self.context['request'].build_absolute_uri(instance.image.url)
Run Code Online (Sandbox Code Playgroud)

阅读完所有代码后,您也可以这样做

self.context['request'].build_absolute_uri(instance.image.url)
Run Code Online (Sandbox Code Playgroud)

您还可以在新的关键“图像”中显示与产品相关的图像


class ProductImageSerializer(serializers.ModelSerializer):
    product = ProductSerializer()

    class Meta:
        model = ProductImage
        fields = ['id', 'product', 'image', 'default']
    # remove to_representation function
Run Code Online (Sandbox Code Playgroud)

您还可以使用 SerializerMethodField 将图像作为字符串列表