当存储类型未存储在数据库中时,为什么当我们更改FileField的存储属性时,django会创建一个迁移文件?

时间:2016-12-14 08:22:33

标签: django django-models django-migrations

每当我更改FileField的存储空间时,我都不想创建迁移文件。我从settings.py获取存储类,它是可配置的。

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)

2 个答案:

答案 0 :(得分:4)

当您对模型进行更改时,django必须进行迁移,因为它需要跟踪随着时间的推移对模型所做的更改。但是,这并不总是意味着将在数据库中进行修改。这里产生的迁移是空的。您的迁移可能看起来像这样,你会说,干草不是空的!!

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/'),
        ),
    ]

但它是!!只是做

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

你会发现它不会产生任何SQL!根据@sayse

建议的manual引用
  

Django将对您的模型或字段进行任何更改进行迁移 -   甚至不影响数据库的选项 - 作为唯一的方式   正确地重建一个字段就是拥有所有的变化   历史记录,您可能需要在某些数据迁移中使用这些选项   稍后(例如,如果你设置了自定义验证器)。

答案 1 :(得分:0)

以下是我对您的问题的解释 - 您希望使用settings.py中指定的存储类(可以在以后更改)来存储文件。

假设您在settings.py中指定了xyz存储类并运行makemigrations。 Django将创建一个迁移文件,其存储属性与您在settings.py中指定的属性相同。

现在,如果更改settings.py中的存储类并且不运行makemigrations并上传文件,即使您没有运行makemigrations,您的文件也会上传到您在设置文件中指定的新存储。

希望它有所帮助。