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, но это тоже не помогло. не уверен, что я что-то упустил.