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