mptt使用总结
基本使用流程
- ##### 安装mptt并将
'mptt'
加入到settings.py
文件中的INSTALLD_APPS
中
INSTALLD_APPS = [ # .... 'mptt', ]
- ##### 继承
MPTTModels
并实现自己的树
from django.db import models from mptt.modles import MPTTModel, TreeForeignKey class Category(object): """docstring for Category""" name = modles.CharField(max_length=50, unique=True) parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', db_index=True )
必须在类中定义parent字段, 并且该字段为指向自己(
self
)的TreeForeignKey
, 由于Category
类继承自MPTTModel
, 因此它会默认拥有一些字段,比如level, lft, rght, tree_id
# in views.py def show_category(request): return render( request, 'categorues.html', {'nodes': Category.objects.all()} )
# in urls.py (r'^Category/$', views.show_category, name='show_category')
- 在模板中渲染树
{% load mptt_tags %} <ul> {% recursetree nodes %} <li> {{ node.name }} {% if not node.is_leaf_node %} <ul class='children'> {{ children }} </ul> {% endif %} </li> {% endrecursetree %} </ul>
- ##### 安装mptt并将
模型选项和实例方法
- 创建模型时,由于继承自
MPTTModle
,因此模型包含了一些默认字段,但如果你自己定义的字段名字跟这些字段有冲突,可以通过在Meta
类中为这些默认字段指定新的名称
这些属性包括left_attr right_attr tree_id_attr level_attr order_insertion_by
- 实用的实例方法,在后台可以使用这些实例方法来获取想要的
QuerySet
,这些方法包括
# 获取指定节点的祖先节点,默认从根节点开始 get_ancestors(ascending=False, include_self=False) # 获取指定节点的子节点 get_children() # 获取指定节点的后代节点 get_descendants(include_self=False) # 获取根节点 get_root() # 判断节点属性 is_child_node() is_leaf_node() is_root_node()
- 创建模型时,由于继承自