我正在使用AWS,我的应用程序中会有不同的存储桶。我也在使用Django-Storages。有没有办法指定我要将文件上传到哪个存储桶(例如,作为Save()函数中的参数或其他什么?)
我看到了这个Django - Error importing storages.backends,但我不明白应该如何使用它?!
谢谢!
答案 0 :(得分:21)
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-storage打算解决的用法。我不希望你找到一个可以为你处理这个问题的存储后端。
文档描述了如何手动管理文件:https://docs.djangoproject.com/en/1.9/topics/files/#storage-objects至少您需要将存储文件保存到某处,以便以后在查询模型时找到它。
答案 1 :(得分:6)
另一种解决方案如果要在运行时指定存储桶,可以在模型上调用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将使用您的默认存储区。
答案 2 :(得分:4)
只需在settings.py中提及另一个包含 PRIVATE_BUCKET_NAME ='存储桶名称'的存储桶名称。
创建一个覆盖S3BotoStorage的自定义类,该类可以序列化为迁移文件。
为类s3_storage = S3MediaStorage()
创建一个对象,并将其存储在MyModel的file1字段中
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)
答案 3 :(得分:0)
对于S3Boto3Storage,请使用:
media_file = models.FileField('media file', storage=S3Boto3Storage(bucket_name='media_bucket'), upload_to='media', blank=True)