我使用AWS,我会在我的应用程序不同的桶。 我也使用Django的储量。 有没有指定我想将文件上传到该桶的方式(例如,如保存()函数或任何一个参数?)
我看到这个Django的-错误导入storages.backends ,但我不明白应该如何使用?
谢谢!
我使用AWS,我会在我的应用程序不同的桶。 我也使用Django的储量。 有没有指定我想将文件上传到该桶的方式(例如,如保存()函数或任何一个参数?)
我看到这个Django的-错误导入storages.backends ,但我不明白应该如何使用?
谢谢!
S3BotoStorage
取水桶名作为参数。 如果没有给它会使用AWS_STORAGE_BUCKET_NAME
设置。 这意味着如果你想S3BotoStorage
使用默认的存储后端DEFAULT_FILE_STORAGE
那么它必须使用默认的水桶。
然而,你也可以指定在现场级存储:
from django.db import models
from storages.backends.s3boto import S3BotoStorage
class MyModel(models.Model):
file_1 = models.FileField() # Uses default storage
file_2 = models.FileField(storage=S3BotoStorage(bucket='other-bucket'))
编辑 :
评论越来越失控,所以我会更新我的答案。 实例的基础上更改存储后端的参数是不是东西,Django的存储API的设计做。 存储后端不具有模型实例的知识,因为该存储器可以在模型的上下文之外使用诸如静态文件。 并非完全不合理,但它不是那么的Django Django的或-存储器旨在解决使用。 我不指望你AREN找到存储后端的下降将处理这个要求。
该文档描述了如何可以手动管理文件: https://docs.djangoproject.com/en/1.9/topics/files/#storage-objects某处你至少需要存储在您保存该文件的水桶,让你当你查询模型以后能找到它。
另一种解决方案,如果要指定在运行时斗,你可以调用模型上的save()方法之前完成。
按照上面的例子:
from django.db import models
from storages.backends.s3boto import S3BotoStorage
class MyModel(models.Model):
file_1 = models.FileField() # Uses default storage
file_2 = models.FileField()
在视图保存模型时,可以指定该字段存储。
my_file_model = MyModel()
my_file_model.file_2.storage = S3BotoStorage(bucket="your-bucket-name")
my_file_model.save()
这样file_2将被保存在桶里您指定file_1将使用默认的水桶。
就在settings.py提到另一个名字斗与PRIVATE_BUCKET_NAME =“斗名”。
创造出超越S3BotoStorage和可序列化到迁移文件的自定义类。
创建用于一个类对象s3_storage = S3MediaStorage()
并给它的存储在文件1场中为MyModel
from storages.backends.s3boto import S3BotoStorage
from django.conf import settings
@deconstructible
class S3MediaStorage(S3BotoStorage):
def __init__(self, *args, **kwargs):
kwargs['bucket'] = getattr(settings, 'PRIVATE_BUCKET_NAME')
super(S3MediaStorage, self).__init__(*args, **kwargs)
s3_storage = S3MediaStorage()
class MyModel(models.Model):
file = models.FileField()
file1 = models.FileField(storage=s3_storage)