树形结构模型Django-MPTT
什么是django-mptt?
django-mptt是⼀个可复⽤的django app,旨在让你⾃⼰的django项⽬模型使⽤MPTT更加简单。它负责将数据库表作为树型结构管理的详细信息,并提供⽤于处理树型模型实例的⼯具
对于mptt模型算法实现不了解的可以先看⼀下此⽂档
安装和⽂档
pip install django-mptt
# 依赖安装包django
github地址:
document:
⼀般模型
from django.db import models
dels import MPTTModel, TreeForeignKey
class Genre(MPTTModel):
name = models.CharField(max_length=50, unique=True)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
因为MPTTModel继承⾃models.Model,当你的模型需要使⽤多继承时,请务必将MPTTModel放在最前⾯,这⾥跟django的mixin很相似。
MPTTMeta参数
1、parent_attr 默认为“parent”。将模型关联回⾃⾝的字段的名称,这样每个实例都可以是另⼀个实例的⼦实例。⽤户需要在模型上定义此字段如上⽰例的parent字段
2、left_attr 默认名称"lft"。表⽰树型模型字段左边的节点数字,字段类型为PositiveIntegerField
3、right_attr 默认名称"rght"。表⽰树型模型字段右边的节点数字,字段类型为PositiveIntegerField
4、tree_id_attr 默认名称"tree_id"。表⽰包含每个节点的树ID的字段的名称
5、level_attr 默认名称"level"。表⽰每个节点所在的树形结构的层级
6、order_insertion_by 默认值[ ]。当插⼊新的树节点或重新创建现有节点时,应定义排序的字段名列表,⾸先是最重要的排序字段名
⼀般实例
根据上⾯的模型,⽣成数据库
python manage.py makemigrations
python manage.py migrate
定义测试路由
urlpatterns = [
path('genres/', st_mptt),
]
定义测试视图
from django.shortcuts import render
from dels import Genre
# Create your views here.
def test_mptt(request):
return render(request, 'genre.html', {'genres': Genre.objects.all()})
测试模板渲染
{% load mptt_tags %}
<ul>
django项目实例{% recursetree genres %}
<li>
{{ node.name }}
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
此时启动django shell 插⼊数据(或者python console也⾏)
python manage.py shell
from dels import Genre
dandy = ate(name='dandy')
elina = ate(name='elina')
cathy = ate(name='cathy')
ate(name='aaa', parent=dandy)
ate(name='bbb', parent=elina)
ate(name='ccc', parent=cathy)
效果图
MPTT模型实例⽅法
get_ancestors(ascending=False, include_self=False)  # 返回⼀个包含所有当前实例祖宗的queryset
get_children()  # 返回包换当前实例的直接孩⼦的queryset(即下⼀级所有的⼦节点),按树序排列
get_descendants(include_self=False)  # 返回当前实例的所有⼦节点,按树序排列
get_descendant_count()  # 返回当前实例所有⼦节点的数量
get_family()  # 返回从当前实例开始的所有家庭成员节点,⽤树型结构
get_next_sibling()  # 返回当前实例的下⼀个树型同级节点的实例
get_previous_sibling()  # 返回当前实例的上⼀个树型同级节点的实例
get_root()  #获取当前实例的根节点实例
get_siblings(include_self=False)  # 获取所有同级兄弟节点的实例的queryset
insert_at(target, position='first-child', save=False)  # 插⼊作为⽬标节点的第⼀个⼦节点(如果save=True)
is_child_node()  # 是否是⼦节点
is_leaf_node()  # 是否是叶节点
is_root_node()  # 是否是根节点
move_to(target, position='first-child')  # 移动到某个节点的第⼀个⼦节点位置,target为空将会被移到根节点,此时不需要position位置参数position位置参数:
'first-child', 'last-child','left', 'right'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。