编写Django迁移迁移ImageField到django-filer Image实例时遇错如何解决?
Django迁移:解决ImageField转FilerImageField的赋值错误
错误原因
迁移脚本中直接导入filer.models.Image,但Django迁移运行时会使用历史版本的模型,直接导入的Image类和通过apps.get_model获取的Company模型所依赖的Image实例不属于同一类,导致赋值时触发类型不匹配错误:ValueError: Cannot assign "<Image: uploads/example.jpg>": Company.new_image must be a "Image" instance.
修正后的迁移脚本
# Generated by Django 3.2.15 on 2023-04-12 from django.core.files import File from django.db import migrations def copy_image_to_filer_image(apps, schema_editor): # 通过apps获取历史版本的模型,而非直接导入 Company = apps.get_model('app_name', 'Company') FilerImage = apps.get_model('filer', 'Image') for item in Company.objects.all(): if item.image: with open(item.image.path, 'rb') as f: img_file = File(f, name=item.image.name) # 使用获取到的FilerImage模型创建实例 image = FilerImage.objects.create( original_filename=item.image.name, file=img_file ) item.new_image = image item.save() class Migration(migrations.Migration): dependencies = [ ('app_name', '0002_auto_foo'), ] operations = [ migrations.RunPython(copy_image_to_filer_image) ]
关键修改点
- 模型获取方式:所有在迁移中用到的模型都通过
apps.get_model()获取,保证使用的是迁移对应的历史版本模型,避免类实例不匹配。 - 拼写修正:原脚本中
migraions.Migration的拼写错误,修正为migrations.Migration。 - 逻辑保持:保留原有的文件读取和Filer图片创建逻辑,仅调整模型的获取方式。
内容的提问来源于stack exchange,提问作者Marcelo Cordeiro
相关产品推荐
相关产品推荐

