django уникальный аргумент имени файла - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу, чтобы имена моих файлов были уникальными, чтобы предотвратить столкновение.

image = models.ImageField(upload_to=unique_string_generator, unique=True, blank=True)

это мое поле.

def unique_string_generator(instance: any, filename: str, *, path: str) -> str:
"""

:param instance: Instance to pass
:param filename: filename of the uploaded file
:param path: path where to upload
:return: where the file will be uploaded
"""
extension = filename.split('.')[-1]
unique_value = uuid.uuid4()
filename = f'{unique_value}-{instance.pk}.{extension}'
return os.path.join(path, filename)

Это моя функция, как я могу передать

path = 'где-то'

в поле, потому что django принимает мою функцию в качестве аргумента. Небольшой вопрос, что нужно передать для аннотации django instance? Я только что передал

экземпляр: любой

, потому что я не мог понять, что комментировать? Заранее спасибо!

1 Ответ

0 голосов
/ 02 апреля 2020

В такой ситуации, я полагаю, вы можете получить помощь от самого python. Я имею в виду, что вы можете просто проверить тип экземпляра с помощью функции type(). С инструментами отладки или просто оператором print() все будет ясно.

Кстати, djangoproject docs имеет описание о upload_to instance аргумент:

Экземпляр модели, в которой определен FileField. В частности, это конкретный экземпляр, к которому прикрепляется текущий файл.

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


TL; DR

Так, в этом случае, тип аргумента instance является моделью (классом), содержащей этот ImageField.

Например, если ImageField находится внутри User модели, тип экземпляра будет <class 'appname.models.User'>.

def unique_string_generator(instance: User, ...) -> str:
    ...

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