ifequal - django templates examples
Django-almacenamiento con múltiples cubos S3 (3)
Otra solución si desea especificar el 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, el archivo_2 se guardará en el contenedor que especifique, donde el archivo_1 utilizará su contenedor predeterminado.
Estoy usando AWS y tendré diferentes cubos en mi aplicación. También estoy usando Django-Storages. ¿Hay alguna forma de especificar a qué grupo deseo cargar el archivo (por ejemplo, como un parámetro en la función Guardar () o lo que sea?)
Vi este Django - ¿Error al importar almacenamientos.backends , pero no entiendo cómo debería usarse?
¡Gracias!
Solo menciona otro nombre de cubo en settings.py con PRIVATE_BUCKET_NAME = ''nombre de cubo''.
Cree una clase personalizada que anule S3BotoStorage y que pueda ser serializada en archivos de migración.
Crea un objeto para la clase s3_storage = S3MediaStorage()
y dale 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)
S3BotoStorage
toma el nombre del cubo como un parámetro. Si no se proporciona, utilizará la configuración AWS_STORAGE_BUCKET_NAME
. Eso significa que si desea que S3BotoStorage
sea el S3BotoStorage
almacenamiento predeterminado con DEFAULT_FILE_STORAGE
entonces debe usar el grupo predeterminado.
Sin embargo, también puede asignar un almacenamiento en un 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 yendo de las manos, así que actualizaré mi respuesta. Cambiar los parámetros del backend de almacenamiento en función de una instancia no es algo para lo que se diseñó la API de almacenamiento de Django. El back-end de almacenamiento no tiene conocimiento de la instancia del modelo porque los almacenamientos se pueden usar fuera del contexto de un modelo como los archivos estáticos. No es completamente irrazonable, pero no es un uso que Django o django-storages pretendía resolver. No espero que no encuentres una gota en el backend de almacenamiento que maneje esto por ti.
Los documentos describen cómo puede administrar los archivos manualmente: https://docs.djangoproject.com/en/1.9/topics/files/#storage-objects Como mínimo, necesitará almacenar el depósito donde guardó el archivo en algún lugar para que pueda Puedes encontrarlo más tarde cuando consultes el modelo.