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很相似。
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)
效果图
原文:https://www.cnblogs.com/wuzdandz/p/10595416.html