樹形結構模型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'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM