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?
发布于 2015-11-03 14:34:06
能够找到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)发布于 2015-11-01 16:56:18
我对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)https://stackoverflow.com/questions/33451452
复制相似问题