django-cms 3.5下如何迁移废弃cmsplugin-filer插件至djangocms新插件?
Django-CMS 3.5+ 从cmsplugin-filer到djangocms-file/picture的迁移指南
我刚好处理过一模一样的迁移需求,给你一套稳扎稳打的步骤,确保现有插件数据完整保留,平稳过渡到官方推荐的新插件:
迁移前必做准备
- 全量备份数据库:这是底线,不管操作多熟练,先备份!可以用
pg_dump(PostgreSQL)、mysqldump(MySQL),或者Django的python manage.py dumpdata导出全量数据。 - 安装新插件包:
pip install djangocms-file djangocms-picture - 将新插件添加到
settings.py的INSTALLED_APPS:INSTALLED_APPS = [ # ... 其他已有的app 'djangocms_file', 'djangocms_picture', ] - 运行数据库迁移,创建新插件的表结构:
python manage.py migrate
核心插件数据迁移
接下来要把旧插件的数据逐个迁移到新插件中,这里需要编写Django数据迁移脚本,直接手动改数据库风险太高,脚本迁移更安全。
1. FilerFile → djangocms-file
创建一个空的数据迁移文件(在你的主业务app下):
python manage.py makemigrations --empty your_main_app
然后编辑生成的迁移文件,添加以下逻辑:
from django.db import migrations from cmsplugin_filer_file.models import FilerFile from djangocms_file.models import File def migrate_filer_file(apps, schema_editor): # 遍历所有旧的FilerFile实例 for old_file in FilerFile.objects.all(): # 创建新的djangocms-file实例,复制对应字段 new_file = File.objects.create( cmsplugin_ptr=old_file.cmsplugin_ptr, file=old_file.file, label=old_file.label, title=old_file.title, description=old_file.description, download_filename=old_file.download_filename, # 其他字段根据实际使用情况对应复制 ) # 释放旧实例的cmsplugin_ptr关联,避免重复引用 old_file.cmsplugin_ptr = None old_file.save() class Migration(migrations.Migration): dependencies = [ # 依赖djangocms_file的初始迁移,需替换为实际迁移编号 ('djangocms_file', '0001_initial'), ('cmsplugin_filer_file', '0001_initial'), ('your_main_app', '之前的迁移编号'), ] operations = [ migrations.RunPython(migrate_filer_file), ]
2. FilerFolder → djangocms-file-folder
类似上面的步骤,编写迁移脚本处理文件夹插件:
from django.db import migrations from cmsplugin_filer_folder.models import FilerFolder from djangocms_file.models import Folder def migrate_filer_folder(apps, schema_editor): for old_folder in FilerFolder.objects.all(): new_folder = Folder.objects.create( cmsplugin_ptr=old_folder.cmsplugin_ptr, folder=old_folder.folder, label=old_folder.label, title=old_folder.title, description=old_folder.description, ) old_folder.cmsplugin_ptr = None old_folder.save() class Migration(migrations.Migration): dependencies = [ ('djangocms_file', '0002_folder'), ('cmsplugin_filer_folder', '0001_initial'), ('your_main_app', '之前的迁移编号'), ] operations = [ migrations.RunPython(migrate_filer_folder), ]
3. FilerImage → djangocms-picture
编写图片插件的迁移脚本,注意字段对应关系:
from django.db import migrations from cmsplugin_filer_image.models import FilerImage from djangocms_picture.models import Picture def migrate_filer_image(apps, schema_editor): for old_image in FilerImage.objects.all(): new_picture = Picture.objects.create( cmsplugin_ptr=old_image.cmsplugin_ptr, image=old_image.image, alt=old_image.alt_text, caption=old_image.caption, width=old_image.width, height=old_image.height, alignment=old_image.alignment, link=old_image.link, link_target=old_image.link_target, # 其他字段按需复制 ) old_image.cmsplugin_ptr = None old_image.save() class Migration(migrations.Migration): dependencies = [ ('djangocms_picture', '0001_initial'), ('cmsplugin_filer_image', '0001_initial'), ('your_main_app', '之前的迁移编号'), ] operations = [ migrations.RunPython(migrate_filer_image), ]
自定义FilerImage插件的迁移
如果你的项目里有继承自FilerImage的自定义插件,需要分两步处理:
1. 修改自定义插件的父类
把原来继承自FilerImage的代码:
from cmsplugin_filer_image.cms_plugins import FilerImagePlugin class CustomImagePlugin(FilerImagePlugin): # 自定义逻辑
改成继承自djangocms-picture的插件:
from djangocms_picture.cms_plugins import PicturePlugin class CustomImagePlugin(PicturePlugin): # 保留原来的自定义逻辑,调整字段引用(大部分字段如`instance.image`是兼容的)
2. 迁移自定义插件的数据
如果你的自定义插件有额外字段,需要编写迁移脚本复制这些字段。假设你的自定义模型是CustomImage,先修改模型继承关系:
from djangocms_picture.models import Picture class CustomImage(Picture): # 你的自定义字段,比如: custom_tag = models.CharField(max_length=100)
然后编写迁移脚本复制旧数据:
from django.db import migrations from yourapp.models import CustomImage as OldCustomImage from yourapp.models import CustomImage as NewCustomImage def migrate_custom_image(apps, schema_editor): for old_custom in OldCustomImage.objects.all(): # 关联之前迁移好的Picture实例 picture = old_custom.filerimage_ptr.picture_ptr new_custom = NewCustomImage.objects.create( picture_ptr=picture, custom_tag=old_custom.custom_tag, # 其他自定义字段 ) old_custom.filerimage_ptr = None old_custom.save() class Migration(migrations.Migration): dependencies = [ ('yourapp', '修改模型后的迁移编号'), ('djangocms_picture', '0001_initial'), ] operations = [ migrations.RunPython(migrate_custom_image), ]
验证与清理
- 运行所有迁移脚本后,启动Django服务器,逐个页面检查插件是否正常显示、数据是否完整。
- 测试自定义插件的所有功能,确保没有异常。
- 确认迁移完全成功后,可以卸载旧的cmsplugin-filer包:
pip uninstall cmsplugin-filer-file cmsplugin-filer-folder cmsplugin-filer-image - 从
INSTALLED_APPS中移除旧插件的条目。
内容的提问来源于stack exchange,提问作者wfehr
相关产品推荐
相关产品推荐

