用物化路径实现 Django ORM 树形结构
学习在 Django 中不依赖第三方库,通过物化路径(Materialized Path)设计高效树形数据模型,支持快速子树查询与移动节点。 · 难度:入门 · +10XP
物化路径树形结构
传统树形结构常使用递归外键或 MPTT,但物化路径方案在查询子树上性能优异且修改简单。本教程将展示如何利用 CharField 存储路径字符串(如 '001/003/007'),并编写自定义管理器实现 get_descendants、move_node 等操作。你将掌握路径编码策略、索引优化及原子性更新技巧。
from django.db import models
class TreeNode(models.Model):
name = models.CharField(max_length=100)
path = models.CharField(max_length=500, unique=True, db_index=True)
def save(self, *args, **kwargs):
if not self.path:
# 自动生成路径:父路径 + 当前ID
super().save(*args, **kwargs)
self.path = f'{self.path_prefix}{self.pk:010d}'
self.save(update_fields=['path'])
else:
super().save(*args, **kwargs)
@property
def path_prefix(self):
return self.path.rstrip('0123456789') if self.path else ''