[pyar] Consulta sobre Django FileField y Storages

Adam Valair adam en bitspatial.com
Vie Dic 9 10:43:28 ART 2016


Hola.

Tal vez podrías que crear un subclase de FileField y permitirle recibir 
el 'storage' parameter como un callable. Entonces en el definición de 
ese campo en tu clase padre le das un método que define el tipo de 
storage que queres. Asi podrias usar class properties y el metodo juntos 
para cambiar el storage - de la misma manera hemos usado para cambiar el 
`upload_to`. Nuestro caso:


def generate_asset_file_name(instance, filename):
     return '/'.join([instance.storage_string, filename])


class SecureAsset(AssetAbstract):
     file = models.FileField(
             upload_to=asset_helpers.generate_asset_file_name,
             storage=asset_helpers.secure_file_storage)

     @property
     def storage_string(self):
         return "secure_assets"


class EcosystemsAsset(assets.models.SecureAsset):
     @property
     def storage_string(self):
         return "ecosystems_assets"

Si te fijas en el source de FileField no parece terriblemente complicado 
el cambio. Pero de todos modos esta manera tal vez seria medio hackish 
para ustedes.

Saludos.
PD perdón por mi español escrito mas o menos.


On 2016-12-08 9:48 PM, pyar-request at python.org.ar wrote:
> Hola a todos!
>
> Estoy pensando cómo solucionar un tema con django y tal vez alguien de la lista ya se encontró con este problema.
> En django no esta permitido hacer override de un field en subclases [0] y tengo una situación donde me gustaría utilizar un storage o una configuración de storage diferente
> para una subclase. Por ejemplo
>
> DEFAULT_FILE_STORAGE = 'mi_storage_custom'
>
> class Coso(models.Model):
> un_archivo = models.FileField(upload_to="un_path/cualquiera", help_text="El archivo")
>
>
> class SubCoso(Coso):
> """Clase que tiene todo igual a Coso pero quiero que
>
> el campo un_archivo use otro storage"""
> # me gustaría algo tipo
> # un archivo.storage = my_recontra_custom_storage
> pass
>
> Alguna idea de como solucionar esto sin hacer algo muy hackish
> Un ejemplo de la vida real sería que quiero diferente configuración en S3, diferente bucket_name, o usar S3 para la subclase pero no para la clase padre, etc.
>
> [0]https://docs.djangoproject.com/en/1.10/topics/db/models/#field-name-hiding-is-not-permitted
>
> Gracias a todos!
>



Más información sobre la lista de distribución pyar