Это немного сложно. Команда Django makemigrations
пытается сгенерировать файлы миграции программным способом.
Когда вы передаете функцию в ключевое слово upload_to
или default
аргумент поля модели, он импортирует весь модуль, содержащий эту функцию, в файл миграции. Так что в вашем случае Django напишет следующий импорт поверх файла миграции, который он собирается сгенерировать.
import my_app_root.core.helpers
После этого он попытается получить ссылку на эту функцию на __qualname__
из импортированного модуля. Поскольку в вашем случае функция, которая в конечном итоге будет использована для получения пути, будет wrapper
, возвращаемой другой функцией, django попытается выполнить my_app_root.core.helpers.wrapper
, которая будет (и будет) определенно терпеть неудачу.
Таким образом, окончательное решение - использовать функцию уровня модуля в качестве ссылки для аргумента upload_to
. Тем не менее, одно хитрое (и может быть уродливое) решение - назначить вызов функции для переменной и присвоить ей __qualname__
с таким же именем, как этот.
def path_and_rename(path):
# all the functionality here
product_image_upload_path = path_and_rename('products/images/')
# assign it `__qualname__`
product_image_upload_path.__qualname__ = 'product_image_upload_path'
, а затем используйте эту переменную в поле модели следующим образом.
image = ImageField(upload_to=product_image_upload_path)