Pages live in a single treebeard table where path, depth, and numchild encode the hierarchy instead of a parent_id self-reference.
What this Wagtail schema covers
Page tree, sites, and locales
Draft and live revision history
Editorial workflows and moderation tasks
Group permissions over pages, collections, and sites
Images, renditions, documents, and embeds
Search index, redirects, and form submissions
A few decisions the diagram can't show:
wagtailcore_revision is a generic version store: content_type_id plus object_id point at any model, with the snapshot kept in a content JSON column.
Permission tables keep group_id and permission_id as plain ints; Django's auth_group/auth_permission are referenced but not drawn.
wagtailimages_rendition is a derived cache of an Image, keyed unique on (image, filter_spec, focal_point_key), so each crop or resize is stored once.
Workflows attach to pages through WorkflowPage, then run as ordered Task rows tracked per page in WorkflowState and TaskState.
Good fork target if you want a battle-tested CMS page-tree model, but the treebeard path encoding is the gotcha: reparenting a node rewrites every descendant's path string rather than flipping one FK.
Open-source Django CMS with a page tree — Open-source Django CMS used by Google, NASA, and the NHS. Created by Torchbox; built around a page-tree data model for large editorial sites.