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

NEB*_*NEB 3 django django-rest-framework

Django 模型是:

class Post(models.Model):
    name = models.CharField()

class PostImage(models.Model):
    image = models.ImageField()
    post = models.ForeignKey(
        Post,
        related_name=images,
    )
Run Code Online (Sandbox Code Playgroud)

序列化器是:

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',)
Run Code Online (Sandbox Code Playgroud)

串行器数据输出为:

[
    {
        "name": 'Name 1', 
        "images": [
            <ImageFieldFile: 1.jpg>,
            <ImageFieldFile: 2.jpg>,
        ],
    },
    {
        "name": 'Name 2', 
        "images": [
            <ImageFieldFile: 5.jpg>,
        ],
    }
]
Run Code Online (Sandbox Code Playgroud)

但是当尝试获取相同数据的分页响应时,它会因错误而崩溃'ascii' codec can't decode byte 0xff in position 23: ordinal not in range(128)"

这是因为存在ImageFieldFile而不是 URL。

如何获取图像的绝对 url (MEDIA_URL+image-relative-url) 而不是ImageFieldFile

NEB*_*NEB 5

能够弄清楚调查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)
Run Code Online (Sandbox Code Playgroud)