Ada Hakka's Blog

May the force be with you.

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

posted on 2021-03-05 14:14  Adahakka  阅读(200)  评论(0编辑  收藏  举报

导航