私は AWS を使用しており、アプリケーションに異なるバケットを用意します。Django-Storages も使用しています。ファイルをアップロードするバケットを指定する方法はありますか (たとえば、Save() 関数のパラメーターなどとして)。
このDjango - Error importing storages.backendsを見ましたが、どのように使用すべきかわかりません?!
私は AWS を使用しており、アプリケーションに異なるバケットを用意します。Django-Storages も使用しています。ファイルをアップロードするバケットを指定する方法はありますか (たとえば、Save() 関数のパラメーターなどとして)。
このDjango - Error importing 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-storagesが解決することを目的とした使用法ではありません。私はあなたがあなたのためにこれを処理するストレージバックエンドのドロップを見つけることはないと思います。
ドキュメントでは、ファイルを手動で管理する方法について説明しています。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 はデフォルトのバケットを使用します。
PRIVATE_BUCKET_NAME ='bucket name'を使用して、settings.py で別のバケット名を指定するだけです。
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)