Локальная переменная, похоже, нарушает область видимости в Django
Я внедрил эту функцию в файл storage.py
, который импортируется из models.py
:
def uuid_file_name(kind):
def file_name(instance, filename):
h = str(uuid.uuid4())
basename, ext = os.path.splitext(filename)
return os.path.join(f'{kind}_files', h[0:1], h[1:2], h + ext.lower())
return file_name
Цель функции - динамически генерировать имена файлов в объявлении полей, например:
class Thingy(models.Model):
widget = FileField(upload_to=uuid_file_name("widget"))
Теперь, когда я makemigrations
, я получаю странную ошибку:
ValueError: Could not find function file_name in <app>.storage.
В моем проекте нет других упоминаний о file_name
, и если я меняю идентификатор, сообщение об ошибке меняется соответствующим образом, так что ошибка определенно вызвана этим. Однако без некоторого метапрограммирования я не вижу, как file_name
может просочиться из этой функции.
Я думал, что смогу избежать любой магии с помощью from .storage import uuid_file_name as _uuid_file_name
, надеясь, что Django не будет действовать с частным членом модуля, но произошла та же ошибка.
Итак, вопрос из двух частей:
Почему это происходит и как мне это предотвратить?
Есть ли другой способ написать эквивалентный код, чтобы обойти ошибку?
Полное возвращение к трассировке: