Wagtail 批量导入内容数据
前言
在使用 Wagtail 重构团队知识库时遇到一个需求:将原来知识库 6000 多条内容数据导入 Wagtail 中。
原本以为是个简单的导出导入过程,结果也折腾了半天——Wagtail 没有符合要求的插件, 标题和内容分在不同的表等等。
最后是通过命令的方式一次性导入,以下是操作记录:
过程
1、数据准备及格式化
笔者通过 Navicat 将原来知识库的数据导出,只保留标题 title 和内容字段 content,另存为 cvs 格式。
2、新建命令脚本
app 目录下新建文件夹及脚本文件: management/commands/importpage.py。
3、编辑命令脚本
import csv
import sys
from django.core.management.base import BaseCommand
from wikicore.models import WikiIndexPage, WikiPage
csv.field_size_limit(sys.maxsize) # 防止 csv 字段限制的错误
class Command(BaseCommand):
def handle(self, *args, **options):
wiki_index_page = WikiIndexPage.objects.get(page_ptr_id=4) # 父页面对象
reader = csv.DictReader(open("wiki_page.csv")) # csv 绝对路径
for row in reader:
wiki_page = WikiPage(
title=row["title"],
date="2021-3-3", # 笔者 model 中定义的 date 不能为空
body=row["content"]
)
wiki_index_page.add_child(instance=wiki_page)
wiki_page.save_revision().publish()
print("published wiki page " + row["title"])
4、执行命令
(.env) $ python manage.py importpage
published wiki page Home
published wiki page 模板
......
等待程序执行完,数据的导入也就完成了。
总结
进入 django shell 可以这样添加条目,但如此批量添加就不太现实;通过脚本方式,遍历数据源添加导入就方便太多,也自动处理了每个条目中 url 字段的数据。
参考链接:
https://stackoverflow.com/questions/64733059/importing-bulk-creating-pages-in-django-wagtail
https://gist.github.com/tomdyson/ef8c2f684620b84feaddfd7454e09647