django-imagekit - 缩略图字段未被序列化

1 投票
3 回答
1423 浏览
提问于 2025-04-18 16:49

我遇到了以下问题:

我正在用Django写一个AJAX视图,这个视图会提供关于图片列表的JSON数据,这些数据来自一个使用了Django-imagekit扩展的模型,这个模型里有一个叫做ImageSpecField的字段:

class Image(models.Model):
   title = models.CharField(max_length=120)
   img = models.ImageField(upload_to="images")
   thumb = ImageSpecField(source="img",
       id="core:image:image_thumbnail"
     )
   objects = models.Manager()
   json_data = JSONConvertibleManager()

这个模型使用了一个自定义的管理器来把数据转换成JSON格式,这个管理器叫做JSONConvertibleManager,它使用的是Django自带的序列化工具(也就是django.core.serializers的一个实例)。

我的问题是,除了ImageSpecField字段之外,其他所有字段都能正常转换成JSON,但这个ImageSpecField字段完全被忽略了。在序列化的时候,有没有办法返回instance.thumb.url的值呢?

3 个回答

1

这是在@Insa给出的不错解决方案基础上做的小改进...

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.SerializerMethodField()

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image')

    def get_original_image(self, obj):
        if bool(obj.original_image):
            return self.context['request'].build_absolute_uri(obj.original_image.url)
        return ''

这样可以获取缩略图的绝对网址,就像所有的图片字段默认那样。

3

很遗憾,之前被认可的答案现在不再适用了,因为DRF(可能是2.x版本)发生了变化。把这一行替换掉,就能在当前版本(3.5.3)中正常工作:

thumbnail = serializers.ReadOnlyField(source="thumbnail.url")

另外一种解决方案可以让你有更多的控制权(比如修改网址)是:

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.SerializerMethodField()

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image')

    def get_original_image(self, obj):
        # some processing
        return obj.original_image.url
5

只是给大家提供一些信息,我在使用Django Rest Framework,所以用了这个库里的序列化类。

我的模型:

class Photo(models.Model):
    """ Photograph """
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=255)
    original_image = models.ImageField(upload_to='boxes')
    formatted_image = ImageSpecField(source='original_image', format='JPEG',
        options={'quality': 90})
    thumbnail = ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
        ResizeToFill(200, 115)], source='original_image',
        format='JPEG', options={'quality': 90})
    num_views = models.PositiveIntegerField(editable=False, default=0)

我的序列化器:

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.Field('original_image.url')
    thumbnail = serializers.Field('thumbnail.url')

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image', 'thumbnail',)

撰写回答