#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
методе, потому что у него нет доступа к запросу.