29

我正在使用 AWS,我的应用程序中会有不同的存储桶。我也在使用 Django-Storages。有没有办法指定我要将文件上传到哪个存储桶(例如,作为 Save() 函数中的参数或其他什么?)

我看到了这个Django - Error importing storages.backends,但我不明白应该如何使用它?!

4

4 回答 4

30

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-storages 旨在解决的用法。我不希望您找到可以为您处理此问题的存储后端。

文档描述了如何手动管理文件:https ://docs.djangoproject.com/en/1.9/topics/files/#storage-objects至少您需要将存储桶存储在某处保存文件的位置,以便您稍后查询模型时可以找到它。

于 2012-05-02T18:30:39.777 回答
11

如果您想在运行时指定存储桶,另一种解决方案是在调用模型上的 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 将使用您的默认存储桶。

于 2014-12-18T08:14:50.553 回答
8

只需在 settings.py 中使用PRIVATE_BUCKET_NAME ='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)
于 2016-08-31T11:22:39.687 回答
2

对于 S3Boto3Storage 使用这个:

media_file = models.FileField('media file', storage=S3Boto3Storage(bucket_name='media_bucket'), upload_to='media', blank=True)
于 2020-12-05T08:53:04.967 回答