2016-12-14 36 views
1

我不想在更改FileField的存储时创建迁移文件。我从settings.py中获取存储类并且它是可配置的。当存储类型未存储在数据库中时,为什么在我们更改FileField的存储属性时,django会创建迁移文件?

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) 
+0

如果未在设置中指定存储,则使用默认存储并创建迁移。如果我在初始迁移后更改存储空间,则会创建一个新的迁移文件,我不希望这样做。 –

回答

1

这里是我的解释你的问题 - 你想用你的settings.py指定的存储类(可以在未来改变)来存储文件。

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

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

希望它有帮助。

+0

是的,这会有所帮助,但如果我在构建脚本中运行makemigrations会怎么样?然后将创建迁移。 –

+0

您是否找到解决方案?我遇到了同样的问题。我的本地设置与其他开发者不同,因此每次有人执行迁移时,迁移文件中的路径会因路径不同而发生更改 – nelsonvarela

2

当你永远做一个变化对模型的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从​​报价

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

+0

@ e4c5 sqlmigrate显示sql语句,但我不想要创建迁移文件。无论如何,这是可能的吗? –

+0

不,这是不可能的。参考更新的答案。为什么要有空迁移成为一个问题呢? – e4c5

+0

我的使用案例中的迁移将导致迁移历史冲突。 –

相关问题