簡體   English   中英

帶有簡單縮略圖的 Django Rest 框架

[英]Django Rest Framework with easy-thumbnails

使用普通的 ImageField,序列化 URL 只是image = serializers.ImageField() 使用簡單縮略圖時應該是什么樣子?

到目前為止,我只找到了一個獲取 URL 的函數: Django easy_thumbnails accessing image URLs在序列化器中使用它需要一個 SerializerMethodField,這是一個不令人滿意的解決方案。 我正在尋找一種既實用又高效的解決方案。

最好的解決方案可能是將serializers.ImageField()子類serializers.ImageField()並使用您在to_representation方法中找到的代碼( 自定義字段的文檔)。 您的字段可能如下所示:

from easy_thumbnails.templatetags.thumbnail import thumbnail_url

class ThumbnailSerializer(serializers.ImageField):

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

設置.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')

你能做的是。 步驟 1. 安裝 sorl-thumbnail 並將其添加到 settings.py

pip install sorl-thumbnail 
./manage.py migrate

步驟 2. 安裝 sorl-thumbnail-serializer-field

pip install sorl-thumbnail-serializer-field

將其添加到 settings.py。 文檔中所述的示例用法( https://github.com/dessibelle/sorl-thumbnail-serializer-field

class TestModelSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = TestModel

    # A thumbnail image, sorl options and read-only
    thumbnail = HyperlinkedSorlImageField(
        '128x128',
        options={"crop": "center"},
        source='image',
        read_only=True
    )

    # A larger version of the image, allows writing
    image = HyperlinkedSorlImageField('1024')

sorl-thumbnail 的 Django 3.0 兼容性尚未更新。 所以在目前的 django 3.0 的情況下。

pip install -e git+git://github.com/jazzband/sorl-thumbnail@4fe1854#egg=sorl-thumbnail 

序列化簡單縮略圖字段的簡單包: https : //github.com/yashas123/easy-thumbnails-rest

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM