我的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 - 这不是问题。)
还是...?
答案 0 :(得分:1)
答案是......要求django-avatar维护者修复它。
如果您只想使用默认存储空间,则应将None
或django.core.files.storage.default_storage
传递给ImageField
。在这种情况下,storage
kwarg将不会传递给迁移中的字段。
我创建PR来解决此问题。