Вопрос по python – Django: Как сохранить оригинальное имя файла в FileField?
Я хочу, чтобы имена файлов были случайными, и поэтому я используюupload_to
функция, которая возвращает случайное имя файла примерно так:
from uuid import uuid4
import os
def get_random_filename(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (str(uuid4()), ext)
return os.path.join('some/path/', filename)
# inside the model
class FooModel(models.Model):
file = models.FileField(upload_to=get_random_filename)
Однако я хотел бы сохранить исходное имя файла в атрибут внутри модели. Как то так не работает
def get_random_filename(instance, filename):
instance.filename = filename
ext = filename.split('.')[-1]
filename = "%s.%s" % (str(uuid4()), ext)
return os.path.join('some/path/', filename)
# inside the model
class FooModel(models.Model):
file = models.FileField(upload_to=get_random_filename)
filename = models.CharField(max_length=128)
Как мне это сделать?
Спасибо.
instance.save()
внутри get_random_filename. Но, похоже, это не нужно.
нения. Очевидно, что при запуске вашего get_random_filename вам нужно будет сохранить исходное имя файла в памяти.
# inside the model
class FooModel(models.Model):
file = models.FileField(upload_to=get_random_filename)
filename = models.CharField(max_length=128)
def save(self, force_insert=False, force_update=False):
super(FooModel, self).save(force_insert, force_update)
#Do your code here...
class FooModel(models.Model):
filename = models.CharField(max_length=128)
file = models.FileField(upload_to=get_random_filename)
Обратите внимание на переключение порядка полей выше.
Это не сработает, потому что:upload_to()
вызываетсяpre_save()
, здесь в кодекогда фактическое значениеFileField
необходимо. Вы можете обнаружить, что присвоение атрибутуfilename
вupload()
после генерации первого параметраfilename
во вставке sql. Таким образом, назначение не вступает в силу в сгенерированном SQL и влияет только на сам экземпляр.
Если это не проблема, пожалуйста, опубликуйте код, который вы ввели в оболочку.
super(FooModel, self).save(update_fields=['filename'])
в моей модели сохранить переопределенный метод. Какие-нибудь мысли ?
https://docs.djangoproject.com/en/dev/topics/db/models/
def save(self, *args, **kwargs):
do_something()
super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
do_something_else()