Wagtail - 可以在迁移中重命名流场中的项目吗?

Wagtail - Possible to rename an item in a streamfield in a migration?

我已将 StreamField 中的项目名称从

更改为
tiles = StreamField(
    [
        ('items', StructBlock([
                ('icon', ImageChooserBlock()),
                ('text', CharBlock()),
            ])
         ),
    ], blank=True)

tiles = StreamField(
    [
        ('info', StructBlock([
                ('icon', ImageChooserBlock()),
                ('text', CharBlock()),
            ])
         ),
     ], blank=True)

知道如何创建迁移以重命名该字段吗?

Streamfield 数据存储为 JSON,作为具有 'type' 和 'value' 属性的项目列表。要将字段名称更改应用于所有页面,您应该能够创建一个空迁移(或将其添加到现有迁移),然后添加以下函数或类似于您的迁移文件的内容,然后 运行它:

// other imports

import json

def convert_streamfield_name(apps, schema_editor):
    db_alias = schema_editor.connection.alias

    MyPageModel = apps.get_model('myapp', 'MyPageModel')
    pages = MyPageModel.objects.using(db_alias).all()
    for page in pages:
        revised_stream_data = []
        stream_data = page.tiles.stream_data

        for data in stream_data:
            if data.get('type') == 'items':
                value = data.get('value')
                revised_stream_data.append({
                    'type': 'info'
                    'value': value
                })
            else:
                revised_stream_data.append(data)

        raw_json = json.dumps(revised_stream_data)
        page.tiles = raw_json
        page.save()


class Migration(migrations.Migration):

    dependencies = [...]

    operations = [
        migrations.RunPython(convert_streamfield_name),
        ...
    ]