Wagtail StreamField内容迁移至下层StreamBlock后后台不更新问题求解
解决思路
Wagtail的Page模型存在三重数据存储:数据库直接存储的页面实时值、草稿修订版本记录、已发布版本快照,你直接调用page.save()仅更新了第一层数据,后台编辑页默认加载最新修订版本,已发布页面还会读发布快照,因此出现显示不一致。
具体操作步骤
- 第一步:优先通过Django迁移脚本执行数据迁移,避免手动操作的遗漏。首先生成一个空的迁移文件:
python manage.py makemigrations --empty your_app_name
- 第二步:在生成的空迁移文件中编写如下迁移逻辑,完成字段值更新、新版本创建、发布状态同步三个动作:
from django.db import migrations def migrate_description_data(apps, schema_editor): ProjectPage = apps.get_model('your_app_name', 'ProjectPage') for page in ProjectPage.objects.all(): # 迁移数据 old_data = page.description.raw_data page.description = [{'type': 'section', 'value': old_data}] # 保存数据库实时值 page.save() # 创建新的修订版本(后台编辑页加载的版本来源) page.save_revision() # 如果页面已发布,同步更新发布版本 if page.live: page.publish() class Migration(migrations.Migration): dependencies = [ # 替换为你上一个迁移文件的依赖标识,自动生成的默认值无需修改 ('your_app_name', '00xx_previous_migration'), ] operations = [ migrations.RunPython(migrate_description_data), ]
- 第三步:执行迁移即可生效:
python manage.py migrate
额外注意事项
- 如果你是在shell中临时调试,执行完
page.save()后必须补上page.save_revision()和page.publish()(已发布页面)两个操作,才能让后台看到更新后的值。 - 不需要修改历史修订版本的记录,只要保证最新修订版本和发布版本是新格式即可,不影响现有功能。
- 需确保本迁移的依赖项中包含你修改
description字段结构的迁移,保证迁移时拿到的ProjectPage模型已经是新的StreamField结构。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

