首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DRF:在“ImageField”上使用“ImageField”

DRF:在“ImageField”上使用“ImageField”
EN

Stack Overflow用户
提问于 2015-10-31 12:14:54
回答 2查看 1.1K关注 0票数 3

django模型如下:

代码语言:javascript
复制
class Post(models.Model):
    name = models.CharField()

class PostImage(models.Model):
    image = models.ImageField()
    post = models.ForeignKey(
        Post,
        related_name=images,
    )

序列化程序是:

代码语言:javascript
复制
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',)

序列化程序数据输出如下:

代码语言:javascript
复制
[
    {
        "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

EN

回答 2

Stack Overflow用户

发布于 2015-11-03 14:34:06

能够找到to_representation实现FileField的方法。

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2015-11-01 16:56:18

我对ImageFields没有太多的经验,所以可能会有另一种解决方案,但可以肯定地说,这是可行的:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33451452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档