首页 > 其他分享 >使用django-treebeard实现树类型存储与编辑

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

时间:2024-08-04 21:40:24浏览次数:14  
标签:CaseCategory 存储 name get django add treebeard root

前言

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

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

难道Django已经没落了?

效果

以这个汽车改装项目为例

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

image

安装

安装依赖

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": "渐变色"
    }
  ]
}

小结

还是自己实现的舒服。

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

参考资料

标签:CaseCategory,存储,name,get,django,add,treebeard,root
From: https://www.cnblogs.com/deali/p/18342233

相关文章

  • Jquery正确发送headers值,Django后台request.Meta取值
    jquery发送请求$.ajax({method:"POST",headers:{"Auth_xxx":"yes"},data:{},url:"",success:function(response){console.log("respons......
  • 使用 django 的 EmailMessage 发送波斯语电子邮件时出现问题
    我对django相当陌生,并尝试使用django.core.mail.EmailMessage发送包含波斯语字母的电子邮件。这是我的代码:fromdjango.core.mailimportEmailMessagefromdjango.confimportsettingsdefcustom_sender(subject:str,body:str,recipient_list:list[str],......
  • django增删改查
    1.增classRole(models.Model):title=models.CharField(verbose_name="角色",max_length=32)od=models.IntegerField(verbose_name="排序",default=0)defstr(self):return"{}-{}-{}".format(self.id,self.title,self.od)方法一:obj1......
  • 什么?陶瓷也可以用来存储数据了?
    现在是一个数据指数增长的时代,根据IDC数据预测,2025年全世界将产生175ZB的数据。这里面大部分数据是不需要存储的,在2025预计每年需要存储11ZB的数据。换算个容易理解的说法,1ZB是10^18Bytes,相当于要写5556万块容量18TB的硬盘。这些存储的数据中,仅10%认为是Hot频繁访问的......
  • django多数据库操作
    1.读写分离192.168.1.2default主数据库负责写入192.168.1.3slave从数据库负责读取2.生成数据库表pythonmanage.pymakemigrations分别迁移到主从数据库pythonmanage.pymigrate--database=defaultpythonmanage.pymigrate--database=slave多个app分......
  • 数据结构之特殊矩阵的压缩存储
    1.对称矩阵的压缩存储定义:若n阶矩阵A满足a(ij)=a(ji)(1≤i,j≤n),则称A为n阶对称矩阵。压缩存储方法:由于对称矩阵上三角和下三角的元素相同(主对角线上的元素只存储一次),因此可以只存储上三角(或下三角)的元素和主对角线上的元素。存储方式:通常使用一维数组来存储这些元素。......
  • MySQL数据分析进阶(八)存储过程
    ※食用指南:文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记,笔记整理比较粗糙,主要目的自存为主,记录完整的学习过程。(图片超级多,慎看!)【中字】SQL进阶教程|史上最易懂SQL教程!10小时零基础成长SQL大师!!https://www.bilibili.com/video/BV1UE41147KC/?spm_id_from=333.1007.0.......
  • 在django中以一对一的关系保存表单数据
    我与Django用户模型和自定义配置文件模型具有一对一的关系。我尝试在用户注册时同时保存用户和个人资料数据。但问题是配置文件模型的数据未验证且数据未保存在数据库中这是代码model.pyclassProfile(models.Model):user=models.OneToOneField(User,on_delete=......
  • Android Studio开发学习(二、注册存储)
    用户注册首先我们创建一个新的Activity,将他命名为RegisterActivity我们还是先设计注册界面布局(根据自身喜好),我这里延用了上一篇透明框布局bg_username、btn_left、btn_right上一篇我们已经简单介绍了LinearLayout、TextView、EditText功能,这里补充一下Button布局,它决定按钮......
  • 第一个Django工程创建及运行
    认识DjangoDjango是一个高级PythonWeb框架,它鼓励快速开发和简洁、实用的设计。它由经验丰富的开发人员构建,解决了Web开发的大部分麻烦,因此您可以专注于编写应用程序,而无需重新发明轮子。它是免费和开源的。快得离谱。Django旨在帮助开发人员尽快将应用程序从概念到......