аватар question@mail.ru · 01.01.1970 03:00

Динамический путь для upload_to в модели django (models.FileField)

Здравствуйте, В 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 модели.

аватар answer@mail.ru · 01.01.1970 03:00

Ваш вопрос немного ставит в тупик, потому как лично у меня в версии до 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'))

Последние

Похожие