什么是django-mptt?

django-mptt是一个可复用的django app, 旨在让你自己的django项目模型使用MPTT更加简单。它负责将数据库表作为树型结构管理的详细信息,并提供用于处理树型模型实例的工具

对于mptt模型算法实现不了解的可以先看一下此文档 https://www.ibase.ru/files/articles/programming/dbmstrees/sqltrees.html

安装和文档

pip install django-mptt
# 依赖安装包django

github地址:https://github.com/django-mptt/django-mptt

document:https://django-mptt.readthedocs.io/

一般模型

from django.db import models
from mptt.models 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/', views.test_mptt),
]

定义测试视图

from django.shortcuts import render
from mptt_test.models import Genre # Create your views here. def test_mptt(request):
return render(request, 'genre.html', {'genres': Genre.objects.all()})

测试模板渲染

{% load mptt_tags %}
<ul>
{% 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 test_mptt.models import Genre
dandy = Genre.objects.create(name='dandy')
elina = Genre.objects.create(name='elina')
cathy = Genre.objects.create(name='cathy')
Genre.objects.create(name='aaa', parent=dandy)
Genre.objects.create(name='bbb', parent=elina)
Genre.objects.create(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'

树形结构模型Django-MPTT的更多相关文章

  1. R--基本统计分析方法(包及函数)

    摘要:目前经典的统计学分析方法主要有回归分析,Logistic回归,决策树,支持向量机,聚类分析,关联分析,主成分分析,对应分析,因子分析等,那么对于这些经典的分析方法在R中的使用主要有那些程序包及函 ...

  2. 《R包的分类介绍》

    R分析空间数据(Spatial Data) R机器学习包(Machine Learning) R多元统计包(Multivariate Statistics) R药物(代谢)动力学数据分析包 R计算计量 ...

  3. R语言︱常用统计方法包+机器学习包(名称、简介)

    一.一些函数包大汇总 转载于:http://www.dataguru.cn/thread-116761-1-1.html 时间上有点过期,下面的资料供大家参考基本的R包已经实现了传统多元统计的很多功能 ...

  4. ML—机器学习常用包(持续更新….)

    机器学习是计算机科学和统计学的边缘交叉领域,R关于机器学习的包主要包括以下几个方面: 1)神经网络(Neural Networks): nnet.AMORE以及neuralnet,nnet提供了最常见 ...

  5. R语言常用包汇总

    转载于:https://blog.csdn.net/sinat_26917383/article/details/50651464?locationNum=2&fps=1 一.一些函数包大汇总 ...

  6. R语言中的机器学习包

    R语言中的机器学习包   Machine Learning & Statistical Learning (机器学习 & 统计学习)  网址:http://cran.r-project ...

  7. 联邦学习(Federated Learning)

    联邦学习简介        联邦学习(Federated Learning)是一种新兴的人工智能基础技术,在 2016 年由谷歌最先提出,原本用于解决安卓手机终端用户在本地更新模型的问题,其设计目标是 ...

  8. 论一种基于JS技术的WEB前端动态生成框图的方法

    前言 HTML是一种标记语言,由HTML的标签元素和文本编写的文档可被浏览器描述为一幅网页.通常情况下网页的实现是由HTML.CSS和Javascript三者结合完成的,HTML负责网页的结构,CSS ...

  9. 《Machine Learning in Action》—— Taoye给你讲讲决策树到底是支什么“鬼”

    <Machine Learning in Action>-- Taoye给你讲讲决策树到底是支什么"鬼" 前面我们已经详细讲解了线性SVM以及SMO的初步优化过程,具体 ...

随机推荐

  1. ProxyChains 的坑, 需要关闭 sip

    之前 10.12.6 还可以的,现在升级下系统就用不了了. search下发生时sip问题. 解决方案就时要关闭这个东西; 关闭SIP reboot # 按住 option 键 # 到系统选择页面后, ...

  2. mysql容灾备份脚本

    一,环境需求 **安装前准备 操作系统环境:Centos 7.2 [root@localhost soft]# rpm -qa | grep mariadb [root@localhost soft] ...

  3. C# out ref 用法总结

    C#里面的 out 和ref参数时常会用到,但对它们的区别比较模糊.所以总结一下.下面是测试代码: public void Start() { //outSum没必要赋值,赋值了也完全没用. //如果 ...

  4. 随心测试_数据库_001<论数据的重要性>

    测试工作中,数据的重要性 软测工程师:作为综合运用多学科知识,保障软件质量的重要岗位.需要我们学以致用,在工作中不断学习提升.以下:软测人员必备_数据库核心技能学习点,供大家学习参考. Q1:什么是: ...

  5. 大神教你如何解决Linux系统80端口被占用

    有Linux在centos下面安装webmail服务遇到80端口被占用的问题,导致无法继续安装,下面详细介绍下Linux如何查看.查找.关闭监听80端口服务以更好的的解决80端口被占用的问题. 一.查 ...

  6. VS2019 离线安装方法详解

    本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发..NET 桌面开发相关的工作负载.MFC 可选组件及帮助查看器. 工作负载(Workload) 离线安装需要先根据 ...

  7. Docker 核心技术之Dockerfile

    Dockerfile 简介 什么是Dockerfile Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件 利用docker build命令依次执行在Dockerfile中定义 ...

  8. bzoj 5338: [TJOI2018]xor (树链剖分+可持久化01Trie)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5338 题面: 5338: [TJOI2018]xor Time Limit: 30 Sec  ...

  9. Redisson分布式锁实现

    转: Redisson分布式锁实现 2018年09月07日 15:30:32 校长我错了 阅读数:3303   转:分布式锁和Redisson实现 概述 分布式系统有一个著名的理论CAP,指在一个分布 ...

  10. java 判断语句和循环语句

    一.判断语句:if和switch if(关系表达式1) { 语句体1; }else if (关系表达式2) { 语句体2; }…else { 语句体n+; } switch(表达式) { case 值 ...