DRF-M2M通过ImageField的序列化程序给出UnicodeDecodeError

问题描述 投票:1回答:1

我想通过关系使用M2M序列化模型。对于ImageField以外的所有其他字段,其工作正常。以下是我的模型和序列化文件:

models.py

class Product(models.Model):
    name = models.CharField('Name', max_length=255, null=True, blank=True)
    description = models.TextField('Description', max_length=1000, null=True, blank=True)
    price = models.IntegerField('Price', default=0)
    image = models.ImageField('Product Image', null=True, blank=True)


class Cart(models.Model):
    user = models.CharField('User ID', default="1000", max_length=255)
    items = models.ManyToManyField("Product", through='CartActions', blank=True)
    modified = models.DateField('Last Modified')


class CartActions(models.Model):
    product = models.ForeignKey('Product', on_delete=models.CASCADE)
    cart = models.ForeignKey('Cart', on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField(default=0)

serializers.py

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'description', 'price', 'image']


class CartSerializer(serializers.HyperlinkedModelSerializer):
    items = CartActionsSerializer(source='cartactions_set', many=True)

    class Meta:
        model = Cart
        fields = ['id', 'user', 'items']


class CartActionsSerializer(serializers.HyperlinkedModelSerializer):
    name = serializers.ReadOnlyField(source='product.name')
    price = serializers.ReadOnlyField(source='product.price')
    image = serializers.ReadOnlyField(source='product.image')  # Adding this line gives error

    class Meta:
        model = CartActions
        fields = ['name', 'price', 'image', 'quantity']

这是我点击API时遇到的错误:

[[/ store / api / cart /处的UnicodeDecodeError

'utf-8'编解码器无法解码位置0的字节0xff:无效的起始字节

这是我从/api/products API中获得的示例响应:

{ "id": 1, "name": "Product 1", "description": "This is a sample description", "price": 500, "image": "http://192.168.43.210:9000/media/sample_product.jpeg" }

我已经尝试了stackoverflow和其他网站中的几乎所有参考,但是我在任何地方都找不到完全相同的问题。任何帮助都非常感谢。预先感谢。
python django django-rest-framework many-to-many serializer
1个回答
0
投票
在此序列化程序中,您没有明确定义字段序列化程序,仅提及了字段列表:

class ProductSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Product fields = ['id', 'name', 'description', 'price', 'image']

DRFrecognizedimage作为ImageField并应用具有serializers.ImageField参数的use_url序列化器:

use_url-如果设置为True,则URL字符串值将用于输出表示。如果设置为False,则文件名字符串值将用于输出表示。默认为UPLOADED_FILES_USE_URL设置键的值,除非另有设置,否则为True。

因此,它以ProductSerializer作为URL而不是二进制图片或文件名序列化。

在另一个序列化程序中,您已明确定义了字段序列化程序:

class CartActionsSerializer(serializers.HyperlinkedModelSerializer): ... image = serializers.ReadOnlyField(source='product.image')

ReadOnlyField是输出source as it is的通用串行器。因此,“ product.image”返回一个ImageField实例,该实例不是URL或路径-它是具有许多属性的整个对象。

因此,请尝试使用特定的字段序列化器

serializers.ImageField(read_only=True, ...)

或使用default来更明确地指出源,以避免在图像丢失时出现错误

serializers.ReadonlyField(source='product.image.url', default=None, ...)

或通过method访问此值

class CartActionsSerializer(serializers.HyperlinkedModelSerializer): ... image = serializers.SerializerMethodField() def get_image(self, obj): return obj.product.image.url

© www.soinside.com 2019 - 2024. All rights reserved.