树形结构模型Django-MPTT
什么是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, TreeForeignKeyclass 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 makemigrationspython 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'
转载于:https://www.cnblogs.com/wuzdandz/p/10595416.html
树形结构模型Django-MPTT相关推荐
- Django MPTT —— 概述
什么是修改前序树遍历? MPTT是一种在数据库中存储分层数据的技术,其目的是使检索操作非常有效. 这种效率的折衷是,在树上执行插入和移动项需要更多的工作,因为需要一些额外的工作来保持树结构始终处于良好 ...
- Django MPTT —— 安装
官方发布 官方版本可以从PyPI获得,您可以使用pip安装它: pip install django-mptt 您还可以下载.zip分发文件并将其解压缩.里面有一个脚本名为setup.py. 输入以下 ...
- 网页js实现的各种3D树形结构模型
树状结构的意义就在于它能在一个系统内部帮助我们很好的建立知识之间的关联,并最终回归知识的本质. 树形结构有着令人着迷的性质,很多我们现实生活中存在的关系都能用树形结构来描述,对树形结构的迷恋,令我萌生 ...
- [转]Django 好用的第三方包
1. Python social auth 一款社交账号认证/注册机制,支持Django.Flask.Webpy等在内的多个开发框架,提供了约50多个服务商的授权认证支持,如Google.Twitte ...
- Java树形结构设计与开发
树形结构是我们开发过程中经常遇到的一种数据结构 例如:权限树,菜单树,分类树-- 数据表结构 其数据库设计大多如下: create table sys_menu (id varchar(64) pri ...
- django的优缺点总结 - Python Web开发面试必备
Django是利用Python语言从事Web开发的首选框架.如果你以后想从事python web开发工作,就必需了解其优缺点.这些都可能会是你将来的面试题哦. Django的优点 功能完善.要素齐全: ...
- Django基础(11): 表单集合Formset的高级用法详解
Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息.今天小编我就介绍下Djang ...
- 基于 MPTT 简单实现部门树管理
前言 MPTT即Modified Preorder Tree Taversal,直译就是修改的先序树遍历.而实际也正是如此,MPTT就是在对树进行先序遍历的基础上在每个节点中增加了left和right ...
- Django 2.0 官方中文文档终于发布啦! 附链接!
对于很多想从事学习Django Web开发的很多人而言,Django一直没有官方的中文文档是个弊端.而且Django更新较快,国内很多翻译版本都太滞后了.现在小编我告诉大家一个好消息!! Django ...
最新文章
- Android 手把手教您自定义ViewGroup
- chapter2 机器学习之KNN(k-nearest neighbor algorithm)--K近邻算法从原理到实现
- JavaScript高程第十章:DOM(上)
- Java生成pgp密钥对_在Javascript中生成PGP密钥对,并使用加密的PGP私钥对文本进行签名...
- python知识汇总,python一期
- GCC:使用图对比编码的图神经网络预训练模型 KDD2020
- LSTM背后的数学原理
- 达梦数据库SQL语法
- [观点]中国传统文化的遗失清单上我们丢掉了什么(作者:侯虹斌)
- 解决Chrome、Safair、Webkit等内核浏览器默认文本域和文本
- 快速部署OpenStack的操作笔记(珍藏版)
- Android朋友圈怎么换行,2020年发朋友圈打字怎么换行
- 数据库常用操作语句总结
- 题目59 考勤记录(ok)
- bash install.sh ********错误
- sql server中datename函数的使用
- Windows获取系统唯一标识UUID
- [Computer Architecture读书笔记] H.2 Detecting and Enhancing Loop-Level Parallelism
- python参考文献及其出版社_参考文献查重-Python
- AElf区块链分红合约(Profit Contract)接口和实现思路