Как использовать идентификатор первичного ключа в имени загружаемого файла / изображения? - PullRequest
2 голосов
/ 21 июня 2009

Мне нужно сгенерировать имя загруженного изображения с маской

images/{{ uploaded_image.id }}.jpg

Я думаю, что лучший способ сделать это - свойство FileField.upload_to , но оно написано Здесь :

В большинстве случаев этот объект еще не был сохранен в базе данных, поэтому, если он использует AutoField по умолчанию, он может еще не иметь значения для своего поля первичного ключа.

Может быть, в моем случае будет лучше переименовать файл после сохранения объекта в save () метод?

Ответы [ 3 ]

7 голосов
/ 21 июня 2009

Что я делаю, так это назначаю функцию upload_to, затем присваиваю UUID - это функция, которую он сохраняет:

import uuid

def get_upload_to(instance, filename):
    instance.uuid = uuid.uuid4().hex
    return 'blah/%s/%s' % (instance.uuid, filename)

class Photo(models.Model):
    file = models.FileField(max_length=200,upload_to=get_upload_to)
    uuid = models.CharField(max_length=32)
2 голосов
/ 21 июня 2009

Чтобы избежать проблем с параллелизмом, вам нужно сохранить ваш объект в базе данных, прежде чем вы определите имя файла (потому что даже если вы получите следующий инкрементный идентификатор, который возможен, он может измениться, пока вы сохраняете файл.) объект, а затем переименуйте файл.

0 голосов
/ 22 июня 2009

Спасибо, Бликст и Тодд! Я выбираю лучшее решение для моей проблемы:

import time
class Image(models.Model):
    def _get_upload_to(instance, filename):
        return 'images/%f.jpg' % time.time()

    original = models.ImageField(upload_to=_get_upload_to, ....)

Это гарантирует, что каждое имя файла будет уникальным в том же каталоге. В моем случае мне нужны только файлы jpg, поэтому в других случаях можно заменить оригинальное расширение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...