Django REST Framework: загрузить изображение и переименовать его

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Мое приложение используется для регистрации ресторанов в системе. Вместе с некоторыми данными (например, названием ресторана) интерфейс отправляет логотип ресторана. Используя этот код:

 class Base64ImageField(serializers.ImageField):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.default_error_messages['image_not_png'] = _(
            'Only .png files are supported.'
        )    

    def to_internal_value(self, data):
        if isinstance(data, six.string_types):
            if 'data:' in data and ';base64,' in data:
                header, data = data.split(';base64,')
            try:
                decoded_file = base64.b64decode(data)
            except TypeError:
                self.fail('invalid_image')
            file_name = str(uuid.uuid4())
            file_extension = self.get_file_extension(file_name, decoded_file)
            if file_extension is not 'png': 
                self.fail('image_not_png')
            complete_file_name = '%s.%s'.format(file_name, file_extension)
            data = ContentFile(decoded_file, name=complete_file_name)
        return super().to_internal_value(data)

    def get_file_extension(self, file_name, decoded_file):
        return imghdr.what(file_name, decoded_file)
 

Я смог расшифровать и сохранить логотип на диск с некоторым случайно сгенерированным именем. Теперь мне интересно, как правильно назвать этот файл. Под «правильно» я подразумеваю, что я хочу назвать файл логотипа так же, как и название ресторана, что проблематично, потому что у него to_internal_value нет доступа ни к чему, кроме данных файла. Вопросы: где я должен поместить код для переименования файла, чтобы он совпадал с названием ресторанаэто пришло в том же запросе?

Комментарии:

1. complete_file_name = '%s.%s'.format(file_name, file_extension) это строка, в которой вы называете свой файл. Это то, что вы спросили?

2. Это место, где я называю свой файл, но в качестве используемого имени используется UUID. Что я хочу сделать, так это назвать его по отношению к Restaurant объекту, которому он принадлежит. Я не могу сделать это в to_internal_value методе, потому что у него нет доступа к запросу.