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

med*_*nds 6 django django-storage django-migrations

我的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的初始迁移引用了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),
),
Run Code Online (Sandbox Code Playgroud)

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

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

  • 只是忽略警告.迁移到更改存储实际上不会影响数据库模式,并且由于我的项目的DEFAULT_FILE_STORAGE自启动以来一直是S3BotoStorage,因此不需要进行数据迁移.

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

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

  • 要么...?

Ser*_*eev 1

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

如果您只想使用默认存储,您应该传递Nonedjango.core.files.storage.default_storageImageField。在这种情况下,storagekwarg 将不会传递到迁移中的字段。

我创建了PR来解决这个问题。