Django"变化没有反映在迁移中#34;使用ImageField和自定义存储

时间:2015-09-15 17:37:42

标签: django django-migrations django-storage

我的Django 1.8应用使用第三方应用(django-avatar),其模型包含ImageField。我还在我项目的settings.py中使用自定义DEFAULT_FILE_STORAGE(来自django-storages-redux的S3BotoStorage)。因此,每次运行manage.py migrate时,我都会收到有关头像应用的警告:

  

您的模型的更改尚未在迁移中反映出来,因此无法应用。   运行' manage.py makemigrations'进行新的迁移,然后重新运行“manage.py migrate'应用它们。

...因为avatar's initial migration引用了Django的默认FileSystemStorage。运行makemigrations会在头像应用中创建一个新的0002迁移,以使其ImageField的存储与我的项目设置相匹配:

...
migrations.AlterField(
    model_name='avatar',
    name='avatar',
    field=models.ImageField(storage=storages.backends.s3boto.S3BotoStorage(), max_length=1024, upload_to=avatar.models.avatar_file_path, blank=True),
),

问题是,这个新的迁移是在我的项目之外安装在python的站点包中的头像中创建的(因此在git控件之外,不可用于部署等)。

使用自定义DEFAULT_FILE_STORAGE在项目中使用ImageField (或FileField)的第三方应用处理迁移的正确方法是什么?我考虑过了:

  • 忽略警告。迁移到更改存储实际上并不存在 影响数据库架构,因为我的项目的DEFAULT_FILE_STORAGE已经存在 S3BotoStorage从一开始就不需要进行数据迁移。

  • 使用settings.MIGRATION_MODULES移动头像 迁移到我的项目中。 (然后小心翼翼地移植每一个未来 头像迁移到我的副本 - 这似乎容易出错。) [编辑:this comment django-users邮件列表表明这是错误的方法。]

  • 要求django-avatar(或django-storages-redux)维护者改变......什么? (顺便说一句,S3BotoStorage已经deconstructible - 这不是问题。)

  • 还是...?

1 个答案:

答案 0 :(得分:1)

答案是......要求django-avatar维护者修复它。

如果您只想使用默认存储空间,则应将Nonedjango.core.files.storage.default_storage传递给ImageField。在这种情况下,storage kwarg将不会传递给迁移中的字段。

我创建PR来解决此问题。