[英]DRF: Using 'SlugRelatedField' on the 'ImageField'
Django 模型是:
class Post(models.Model):
name = models.CharField()
class PostImage(models.Model):
image = models.ImageField()
post = models.ForeignKey(
Post,
related_name=images,
)
序列化器是:
class PostSerialiser(serializers.ModelSerializer):
name = serializers.CharField()
images = serializers.SlugRelatedField(
slug_field='image',
many=True,
read_only=True,
)
class Meta:
model = PostModel
fields = ('name' 'images',)
序列化器数据输出为:
[
{
"name": 'Name 1',
"images": [
<ImageFieldFile: 1.jpg>,
<ImageFieldFile: 2.jpg>,
],
},
{
"name": 'Name 2',
"images": [
<ImageFieldFile: 5.jpg>,
],
}
]
但是当试图获得相同数据的分页响应时,它崩溃并出现错误'ascii' codec can't decode byte 0xff in position 23: ordinal not in range(128)"
这是因为存在ImageFieldFile
而不是 URL。
如何获得绝对URL的图像,而不是的(MEDIA_URL +图像相对URL) ImageFieldFile
?
能够找出寻找到to_representation
实施FileField
。
class ImageUrlField(serializers.RelatedField):
def to_representation(self, instance):
url = instance.image.url
request = self.context.get('request', None)
if request is not None:
return request.build_absolute_uri(url)
return url
class PostSerialiser(serializers.ModelSerializer):
name = serializers.CharField()
images = serializers.ImageUrlField(many=True, read_only=True)
我对 ImageFields 没有太多经验,所以可能有另一种解决方案,但可以肯定这会起作用:
class ImageUrlField(serializers.RelatedField):
def to_representation(self, value):
# Build absolute URL (next line is just sample code)
str = settings.MEDIA_URL + str(value.image)
return str
class PostSerialiser(serializers.ModelSerializer):
name = serializers.CharField()
images = serializers.ImageUrlField(many=True, read_only=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.