我想通过关系使用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和其他网站中的几乎所有参考,但是我在任何地方都找不到完全相同的问题。任何帮助都非常感谢。预先感谢。
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