No quiero crear un archivo de migración cada vez que cambio el almacenamiento de FileField. Obtengo la clase de almacenamiento de settings.py y es configurable.

Settings.py

Storage =  S3BotoStorage(bucket='example')

Models.py

 from django.conf import settings

 class myModel(models.Model):
        file = models.FileField(upload_to='', blank=True, storage=settings.Storage)
5
Vaibhav Singh 14 dic. 2016 a las 11:22

2 respuestas

La mejor respuesta

Aquí está mi interpretación de su pregunta: desea utilizar la clase de almacenamiento (que se puede cambiar en el futuro) especificada en su settings.py para almacenar los archivos.

Suponga que especifica la clase de almacenamiento xyz en su settings.py y ejecuta makemigrations. Django creará un archivo de migración con el atributo de almacenamiento como el que había especificado en settings.py.

Ahora, si cambia la clase de almacenamiento en settings.py y no ejecuta makemigrations y carga su archivo, su archivo se cargará en el nuevo almacenamiento que especificó en el archivo de configuración, incluso si no ejecuta makemigrations.

Espero que ayude.

-1
Swapnil 14 dic. 2016 a las 11:19

TLDR: es una migración vacía, es inofensiva, dejar que siga leyendo o probar cosas diferentes probablemente sea una pérdida de tiempo

Siempre que realiza un cambio en un modelo, django tiene que realizar una migración porque necesita realizar un seguimiento de los cambios que se han realizado en un modelo a lo largo del tiempo. Sin embargo, eso no siempre significa que se realizará una modificación en la base de datos. La migración que se produce aquí es vacía. Es probable que su migración se parezca a esto y dirá, ¡¡hay que no está vacío !!

class Migration(migrations.Migration):

    dependencies = [
        ('stackoverflow', '0010_jsonmodel'),
    ]

    operations = [
        migrations.AlterField(
            model_name='jsonmodel',
            name='jfield',
            field=stackoverflow.models.MyJsonField(),
        ),
        migrations.AlterField(
            model_name='parent',
            name='picture',
            field=models.ImageField(storage=b'Bada', upload_to=b'/home/'),
        ),
    ]

¡¡Pero es!! solo haz

./manage.py sqlmigrate <myapp> <migration_number>

¡Y encontrará que no produce ningún SQL! Cita del manual sugerido por @sayse

Django realizará migraciones para cualquier cambio en sus modelos o campos, incluso las opciones que no afectan la base de datos, ya que la única forma en que puede reconstruir un campo correctamente es tener todos los cambios en el historial, y es posible que necesite esas opciones en algunas migraciones de datos más adelante (por ejemplo, si ha configurado validadores personalizados).

7
e4c5 10 jun. 2020 a las 13:13