Django-storage[s3]: совместное использование поля storage и upload_to для поля с изображением не работает

Существует несколько тем/блогов о том, как можно использовать библиотеку django-storage для загрузки файлов/изображений на различные облачные платформы (в моем случае я рассматриваю только S3).

Я последовал этим рекомендациям и настроил его, добавив следующие настройки в settings.py

хранилища в INSTALLED_APPS,

AWS config

AWS_ACCESS_KEY_ID = 
AWS_SECRET_ACCESS_KEY = 
AWS_STORAGE_BUCKET_NAME = 
AWS_S3_REGION_NAME = 
AWS_QUERYSTRING_AUTH = False
STORAGES = {
    "default": {
        "BACKEND": "path.to.CustomStoragBackendsClass",
    },
    "staticfiles": {
        "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
    },
}
class CustomStoragBackendsClass(S3Boto3Storage):
    default_acl = 'public-read'

Теперь в моделях я пытаюсь использовать это следующим образом

class MyModel(mdoel.Model):
    ...
    main_icon = models.ImageField(
           null=True, 
           storage=CustomStoragBackendsClass(location="my_model/main_icons"),
           uplaod_to=main_icon_upload_to_path,
    )
    ...

и вот функция upload_to path в том же файле модели

def main_icon_upload_to_path(instance, filename):
    return f"{instance.pk}/{filename}"

На первый взгляд все это выглядит нормально, но по какой-то причине не работает так, как ожидалось. Я по-прежнему получаю путь без идентификатора экземпляра (в основном, кажется, что upload_to вообще не используется, используется только поле storage).

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

path1 = S3Bucket_name/model1_name/model1_field1_name/instance_id/file_name.png

path2 = S3Bucket_name/model1_name/model1_field2_name/instance_id/file_name.pdf

path3 = S3Bucket_name/model2_name/model2_field1_name/instance_id/file_name.jpg

пробовал указать полный путь в самом поле upload_to, но это тоже не помогло. не уверен, что я что-то упустил.

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