首页 > 其他 > 详细

树形结构模型Django-MPTT

时间:2019-03-25 18:41:13      阅读:651      评论:0      收藏:0      [点我收藏+]

什么是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)

效果图

技术分享图片

 

树形结构模型Django-MPTT

原文:https://www.cnblogs.com/wuzdandz/p/10595416.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!