Solución:
S3BotoStorage
toma el nombre del depósito como parámetro. Si no se proporciona, utilizará el AWS_STORAGE_BUCKET_NAME
configuración. Eso significa que si quieres hacer S3BotoStorage
el backend de almacenamiento predeterminado con DEFAULT_FILE_STORAGE
entonces debe usar el depósito predeterminado.
Sin embargo, también puede asignar un almacenamiento a nivel de campo:
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"))
Editar:
Los comentarios se están saliendo de control, así que actualizaré mi respuesta. Cambiar los parámetros del backend de almacenamiento en base a una instancia no es algo para lo que se diseñó la API de almacenamiento de Django. El backend de almacenamiento no tiene conocimiento de la instancia del modelo porque los almacenamientos se pueden usar fuera del contexto de un modelo, como con archivos estáticos. No es completamente irrazonable, pero no es un uso que Django o django-storages pretendieran resolver. No espero que no encuentre una caída en el backend de almacenamiento que se encargue de esto por usted.
Los documentos describen cómo puede administrar archivos manualmente: https://docs.djangoproject.com/en/1.9/topics/files/#storage-objects Como mínimo, necesitaría almacenar el depósito donde guardó el archivo en algún lugar para que pueda puede encontrarlo más tarde cuando consulte el modelo.
Otra solución si desea especificar un depósito en el tiempo de ejecución, puede hacerlo antes de invocar el método save () en el modelo.
Siguiendo el ejemplo anterior:
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()
En las vistas al guardar el modelo, puede especificar el almacenamiento en ese campo.
my_file_model = MyModel()
my_file_model.file_2.storage = S3BotoStorage(bucket="your-bucket-name")
my_file_model.save()
De esta manera, file_2 se guardará en el depósito que especifiques donde file_1 usará tu depósito predeterminado.
Solo menciona otro nombre de depósito en settings.py con PRIVATE_BUCKET_NAME= ‘nombre del depósito’.
Cree una clase personalizada que anule S3BotoStorage y que se pueda serializar en archivos de migración.
Crea un objeto para la clase s3_storage = S3MediaStorage()
y darlo al almacenamiento en el campo file1 en 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)