繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM