Как закодировать изображение в 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? А если я понимаю суть проблемы неправильно, то подскажите, как тогда можно решить эту проблему?