Django Rest Framework简单缩略图

时间:2016-03-07 01:07:28

标签: django django-rest-framework easy-thumbnails

使用普通的ImageField,序列化URL只是image = serializers.ImageField()。使用简易缩略图时应该是什么样的?

到目前为止,我只找到了获取网址的功能:Django easy_thumbnails accessing image URLs 在串行器中使用它需要SerializerMethodField,这是一个不令人满意的解决方案。我正在寻找一种尽可能高效/高效的解决方案,并且在一条线上。

4 个答案:

答案 0 :(得分:6)

最佳解决方案可能是serializers.ImageField()的子类,并使用您在to_representation方法(docs for custom fields)中找到的代码。您的字段可能如下所示:

from easy_thumbnails.templatetags.thumbnail import thumbnail_url

class ThumbnailSerializer(serializers.ImageField):

    def to_representation(self, instance):
        return thumbnail_url(instance, 'small')

答案 1 :(得分:1)

settings.py

THUMBNAIL_ALIASES = {
    '': {
        'avatar': {'size': (40, 40)},
        'image': {'size': (128, 128)},
    },
}

api / serializers.py

from easy_thumbnails.templatetags.thumbnail import thumbnail_url


class ThumbnailSerializer(serializers.ImageField):
    def __init__(self, alias, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.read_only = True
        self.alias = alias

    def to_representation(self, value):
        if not value:
            return None

        url = thumbnail_url(value, self.alias)
        request = self.context.get('request', None)
        if request is not None:
            return request.build_absolute_uri(url)
        return url

使用

from api.serializers import ThumbnailSerializer


class ProfileSerializer(serializers.ModelSerializer):
    image = ThumbnailSerializer(alias='image')
    avatar = ThumbnailSerializer(alias='avatar', source='image')

答案 2 :(得分:0)

在DRF中将sorl-thumbnail https://sorl-thumbnail.readthedocs.io/en/latest/examples.html与此序列化字段https://github.com/dessibelle/sorl-thumbnail-serializer-field一起使用可以解决此问题。它非常易于使用,因为您不需要更改模型,只需迁移缩略图即可在数据库中创建一个表,以保存拇指的键值对;

答案 3 :(得分:0)

一个简单的程序包,用于序列化简单的缩略图字段:https://github.com/yashas123/easy-thumbnails-rest