Как закодировать изображение в base64 при загрузке его в БД через админ-панель Джанго?

Ребят, подскажите, столкнулся с такой проблемой. Мне нужно написать api, при этом у меня уже есть готовый фронтенд. По заданию, у меня есть модель, в которой есть поле ImageField():

class Recipe(models.Model):
    image = models.ImageField(
        upload_to='api/images/recipes/',
        verbose_name='Картинка',
    )

По условию, при публикации рецепта фронтенд кодирует картинку в строку base64; на бэкенде её необходимо декодировать и сохранить как файл. Я сделал в сериалайзере для поля image новый класс, в котором переопределил метод to_internal_value:

class ImageConversion(serializers.Field):
    def to_representation(self, value):
        return value

    def to_internal_value(self, data):
        try:
            decode = BytesIO(base64.b64decode(data))
            image = Image.open(decode)
        except ValueError:
            raise serializers.ValidationError(
                'Картинка должна быть кодирована в base64'
            )
        return image

class RecipeSerializer(serializers.ModelSerializer):
    image = ImageConversion()

    class Meta:
        model = Recipe
        fields = ('id', 'author', 'name', 'image', 'text', 'ingredients',
                 'tags', 'cooking_time')

Но в таком виде, когда я загружаю рецепты через админку, и загружаю фото через админку, запросы к api не работают, выпадает вот такая ошибка:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Я так понимаю, это происходит потому, что через админ-панель я загружаю в БД фото, не закодированное в base64, и поэтому, когда сериалайзер пытается декодировать это изображение, то получается вот такая ошибка. Так вот суть вопроса. Если я правильно понимаю суть ошибки, то как тогда можно сделать, чтобы при загрузке фото через админ-панель оно кодировалось в base64? А если я понимаю суть проблемы неправильно, то подскажите, как тогда можно решить эту проблему?

Вернуться на верх