Динамический путь для upload_to в модели django (models.FileField)
📁 lambda, python, django, ии
Здравствуйте, В django до версии 1.4 была возможность в модели для models.FileField указать ""динамически"" создаваемый путь хранения файлов в переменную upload_to
models.py#...attach = models.FileField(verbose_name=u'Приложение', blank=True, upload_to=lambda instance, filename: 'attach/%s/%s' % (instance.id,filename))D django версии 1.4 похоже id присваивается позже и поэтому instance.id = None и так же instance.pk = None. Подскажите как можно указать в путь именно id модели.
Ваш вопрос немного ставит в тупик, потому как лично у меня в версии до 1.4 также id не был доступен в upload_to.
Вообще вопрос хранения путей файлов достаточно избит. По мне, так самый нормальный вариант с построением хеша от timestamp + имя файла и создание директорий по первым 4м символам хеша
upload_to = 'upload_path/%s/%s/%s.jpg' % (hash[:1], hash[2:3], hash)UPDATE Касательно именно id в имени файла. Вам надо после сохранения файла, т.е. после присвоения id в базе генерировать новый путь и соответственно перемещать файл по новому пути. На мое субъективное мнение уж слишком затратная операция получается.
UPDATE2
import uuiddef get_file_path(instance, filename): ext = filename.split('.')[-1] filename = ""%s.%s"" % (uuid.uuid4(), ext) retu 'uploads/%s/%s/%s.jpg' % (filename[:1], filename[2:3], filename)и в модели
file = models.FileField(upload_to=get_file_path, null=True, blank=True, verbose_name=_(u'Contact list')) Войдите чтобы оставить ответ