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

时间:2018-03-09 20:38:39

标签: python wagtail

我已经从

更改了StreamField中项目的名称
tiles = StreamField(
    [
        ('items', StructBlock([
                ('icon', ImageChooserBlock()),
                ('text', CharBlock()),
            ])
         ),
    ], blank=True)

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

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

1 个答案:

答案 0 :(得分:2)

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),
        ...
    ]