如何使用django-treebeard实现树类型存储与编辑

 更新时间:2024年08月05日 09:03:49   作者:程序设计实验室  
这篇文章主要介绍了使用django-treebeard实现树类型存储与编辑的宣相关操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

前言

其实之前做很多项目都有遇到跟树相关的功能,以前都是自己实现的,然后前端很多UI组件库都有Tree组件,套上去就可以用。

不过既然用 Django 了,还是得充分发挥一下生态的优势,但是我找了半天,也就这个 treebeard 能用,其他要不停更了要不就功能很拉,没有可视化编辑树的功能。

难道Django已经没落了?

效果

以这个汽车改装项目为例

实现以下效果,可以拖动节点进行编辑

安装

安装依赖

pdm add django-treebeard

将 treebeard 添加到 INSTALLED_APPS

定义model

继承 MP_Node 类型就可以

from treebeard.mp_tree import MP_Node
class CaseCategory(MP_Node):
    name = models.CharField('类别名称', max_length=100)
    node_order_by = ['name']
    def __str__(self):
        return '改装类别: {}'.format(self.name)
    class Meta:
        db_table = 'car_case_category'
        verbose_name = '改装类别'
        verbose_name_plural = verbose_name

配置 admin

需要继承 TreeAdmin 才能实现可视化的树编辑

from treebeard.admin import TreeAdmin
@admin.register(CaseCategory)
class CaseCategoryAdmin(TreeAdmin):
    form = movenodeform_factory(CaseCategory)
    list_display = ['name', 'depth']
    search_fields = ['name']

初始化数据

可以使用代码把初始化的Tree数据导入

(事实上是因为不先导入初始化数据,admin界面连个添加按钮都没有……估计是bug)

def seed_data_treebeard():
    from apps.car.models import CaseCategory
    get = lambda node_id: CaseCategory.objects.get(pk=node_id)
    root = CaseCategory.add_root(name='车衣')
    node = get(root.pk).add_child(name='亮面/光面')
    node = get(root.pk).add_child(name='磨砂/哑光')
    root = CaseCategory.add_root(name='改色')
    get(root.pk).add_child(name='纯色系')
    get(root.pk).add_child(name='渐变色')
    get(root.pk).add_child(name='定制彩绘')
    root = CaseCategory.add_root(name='改装')
    get(root.pk).add_child(name='轮毂')
    get(root.pk).add_child(name='刹车')
    get(root.pk).add_child(name='避震')
    root = CaseCategory.add_root(name='省心提')

这样打开admin界面就可以看到了

算是能用吧

写个接口

然后我再写个简单的接口,基于 django-ninja

(实际上这些代码是 DjangoStarter 自动生成的)

from typing import List
from django.shortcuts import get_object_or_404
from ninja import Router, ModelSchema
from django_starter.http.response import responses
router = Router(tags=['case_category'])
class CaseCategoryOut(ModelSchema):
    class Meta:
        model = CaseCategory
        fields = ['id', 'path', 'depth', 'numchild', 'name', ]
@router.get('/', response=List[CaseCategoryOut], url_name='car/case_category/list')
def list_items(request):
    qs = CaseCategory.objects.all()
    return qs

结果出来的数据是这样(省略部分数据)

{
  "code": 200,
  "data": [
    {
      "id": 4,
      "path": "0001",
      "depth": 1,
      "numchild": 3,
      "name": "改色"
    },
    {
      "id": 7,
      "path": "00010001",
      "depth": 2,
      "numchild": 0,
      "name": "定制彩绘"
    },
    {
      "id": 6,
      "path": "00010002",
      "depth": 2,
      "numchild": 0,
      "name": "渐变色"
    }
  ]
}

小结

还是自己实现的舒服。

不过这个也算是开箱即用了,小项目的话随便搞搞还是可以的。

参考资料

到此这篇关于使用django-treebeard实现树类型存储与编辑的文章就介绍到这了,更多相关django-treebeard树类型存储与编辑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 搭建 FastAPI 项目的详细过程

    Python 搭建 FastAPI 项目的详细过程

    这篇文章主要介绍了Python搭建FastAPI项目的过程,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 聊聊python中not 与 is None的区别

    聊聊python中not 与 is None的区别

    这篇文章主要介绍了在python中not 与 is None的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python3启动web服务引发的一系列问题汇总

    python3启动web服务引发的一系列问题汇总

    由于行内交付的机器已自带python3 ,没有采取自行安装python3,但是运行python脚本时报没有tornado module,遇到这样的问题如何处理呢,下面小编给大家介绍下python3启动web服务引发的一系列问题汇总,感兴趣的朋友一起看看吧
    2023-02-02
  • 基于Django的乐观锁与悲观锁解决订单并发问题详解

    基于Django的乐观锁与悲观锁解决订单并发问题详解

    这篇文章主要介绍了基于Django的乐观锁与悲观锁解决订单并发问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 详解Python 循环嵌套

    详解Python 循环嵌套

    这篇文章主要介绍了Python 循环嵌套的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • TensorFlow梯度求解tf.gradients实例

    TensorFlow梯度求解tf.gradients实例

    今天小编就为大家分享一篇TensorFlow梯度求解tf.gradients实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python3 反射的四种基本方法解析

    python3 反射的四种基本方法解析

    这篇文章主要介绍了python3 反射的四种基本方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Django自定义用户登录认证示例代码

    Django自定义用户登录认证示例代码

    这篇文章主要给大家介绍了关于Django自定义用户登录认证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Python 爬虫图片简单实现

    Python 爬虫图片简单实现

    这篇文章主要介绍了Python 爬虫图片简单实现的相关资料,需要的朋友可以参考下
    2017-06-06
  • 用Python的Tornado框架结合memcached页面改善博客性能

    用Python的Tornado框架结合memcached页面改善博客性能

    这篇文章主要介绍了用Python的Tornado框架结合memcached页面改善vLog性能,主要使用到了缓存来提升性能,需要的朋友可以参考下
    2015-04-04

最新评论