Локальная переменная, похоже, нарушает область видимости в 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 не будет действовать с частным членом модуля, но произошла та же ошибка.

Итак, вопрос из двух частей:

  1. Почему это происходит и как мне это предотвратить?

  2. Есть ли другой способ написать эквивалентный код, чтобы обойти ошибку?


Полное возвращение к трассировке:

Вернуться на верх