zoukankan      html  css  js  c++  java
  • 树形结构模型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, 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'
  • 相关阅读:
    揺する、揺らす、揺さぶる区別
    test
    W5N1のW2D2
    微软企业库6的使用方法
    Delphi XE6 原生解析json
    delphi URL 编码的转换
    Go语言配置与开发环境配置
    Win7 IIS下启用ASP.NET
    Windows2003远程桌面单会话登录
    IIS7应用程序池集成和经典的区别
  • 原文地址:https://www.cnblogs.com/wuzdandz/p/10595416.html
Copyright © 2011-2022 走看看