Django Rest Framework с легкими миниатюрами

С обычным ImageField сериализация URL просто image = serializers.ImageField(), Как это должно выглядеть при использовании easy-thumbnails?

До сих пор я нашел только функцию для получения URL: Django easy_thumbnails для доступа к URL-адресам изображений Использование этого в сериализаторе потребовало бы SerializerMethodField, что является неудовлетворительным решением. Я ищу решение, которое было бы таким же эффективным и эффективным, как практичное, и с одной стороны.

1 ответ

Решение

Лучшее решение, вероятно, для подкласса 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')

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')

Использование sorl-thumbnail https://sorl-thumbnail.readthedocs.io/en/latest/examples.html вместе с этим полем сериализатора https://github.com/dessibelle/sorl-thumbnail-serializer-field в DRF может решать проблему. Он очень прост в использовании, поскольку вам не нужно менять свою модель, просто перенесите миниатюру, которая создает таблицу в вашей базе данных для хранения пары ключ-значение для ваших пальцев;

Простой пакет для сериализации поля easy thumbnailer: https://github.com/yashas123/easy-thumbnails-rest

Другие вопросы по тегам