Saltar al contenido

django-storages con múltiples cubos de S3

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)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *