四、Django模型
Model
Model (模型) 简而言之即数据模型,是一个Django应用的核心。模型不是数据本身(比如数据表里的数据), 而是抽象的描述数据的构成和逻辑关系。
每个Django的模型(model)实际上是个类,继承了models.Model。每个Model应该包括属性(字段),关系(比如单对单,单对多和多对多)和方法。当你定义好Model模型后,Django的接口会自动帮你在数据库生成相应的数据表(table)。
模型的组成
一个标准的Django模型分别由模型字段、META选项和方法三部分组成。我们接下来对各部分进行详细介绍。Django官方编码规范建议按如下方式排列:
- 定义的模型字段:包括基础字段和关系字段
- 自定义的Manager方法:改变模型
- class Meta选项: 包括排序、索引等等(可选)。
- def str():定义单个模型实例对象的名字(可选)。
- def save():重写save方法(可选)。
- def get_absolute_url():为单个模型实例对象生成独一无二的url(可选)
- 其它自定义的方法
模型的字段
models.Model提供的常用模型字段包括基础字段和关系字段。
基础字段
CharField()
from django.db import modelsclass MyModel(models.Model):my_char_field = models.CharField(max_length=100)
- max_length:必填参数,用于限定字段可以存储的字符的最大长度。
- blank:布尔值,默认为 False。如果设置为 True,则该字段允许为空。
- null:布尔值,默认为 False。如果设置为 True,则 Django 在数据库中使用 NULL 来存储空值。
- default:字段的默认值。
- editable:布尔值,默认为 True。如果设置为 False,这个字段将不会在 Django 管理界面或者任何 ModelForm 中显示。
- help_text:用于在表单字段旁边显示额外的帮助文本。
- verbose_name:为字段设置一个人类可读的名字。
TextField()
from django.db import modelsclass MyModel(models.Model):my_text_field = models.TextField()
- 适合大量文本,max_length = xxx选项可选。
- blank:布尔值,默认为 False。如果设置为 True,则该字段允许为空。
- null:布尔值,默认为 False。如果设置为 True,则 Django 在数据库中使用 NULL 来存储空值。
- default:字段的默认值。
- editable:布尔值,默认为 True。如果设置为 False,这个字段将不会在 Django 管理界面或者任何 ModelForm 中显示。
- help_text:用于在表单字段旁边显示额外的帮助文本。
- verbose_name:为字段设置一个人类可读的名字。
DateField() 和DateTimeField()
from django.db import modelsclass MyModel(models.Model):my_date_field = models.DateField()
-
DateField 用于存储日期,不包括时间
-
可通过default=xx选项设置默认日期和时间。
-
对于DateTimeField: default=timezone.now - 先要from django.utils import timezone
-
如果希望自动记录一次修改日期(modified),可以设置: auto_now=True
-
如果希望自动记录创建日期(created),可以设置auto_now_add=True
-
auto_now_add:布尔值,默认为 False。如果设置为 True,则当对象首次被创建时,字段会被设置为当前日期。
-
auto_now:布尔值,默认为 False。如果设置为 True,则每次对象保存时,字段会被设置为当前日期。
-
blank:布尔值,默认为 False。如果设置为 True,则该字段允许为空。
-
null:布尔值,默认为 False。如果设置为 True,则 Django 在数据库中使用 NULL 来存储空值。
-
default:字段的默认值。这可以是一个日期值,或者一个返回日期值的可调用对象。
-
editable:布尔值,默认为 True。如果设置为 False,这个字段将不会在 Django 管理界面或者任何 ModelForm 中显示。
-
help_text:用于在表单字段旁边显示额外的帮助文本。
-
verbose_name:为字段设置一个人类可读的名字。
EmailField()
- 如不是必填项,可设置blank = True和default = ‘。一般Email用于用户名应该是唯一的,建议设置unique = True
- max_length:用于限定字段可以存储的字符的最大长度。默认值为 254,这是因为这是标准电子邮件地址的最大长度。
- blank:布尔值,默认为 False。如果设置为 True,则该字段允许为空。
- null:布尔值,默认为 False。如果设置为 True,则 Django 在数据库中使用 NULL 来存储空值。
- default:字段的默认值。
- editable:布尔值,默认为 True。如果设置为 False,这个字段将不会在 Django 管理界面或者任何 ModelForm 中显示。
- help_text:用于在表单字段旁边显示额外的帮助文本。
- verbose_name:为字段设置一个人类可读的名字
IntegerField()
- IntegerField 是一个用于存储整数的字段。
- 它适用于那些需要存储整数的地方,比如年龄、数量等。
- 在数据库层面,通常对应于整数类型。
SlugField()
- SlugField 是一个用于存储“slug”的字符串字段,通常用于URLs。
- “Slug”是一个短标签,通常只包含字母、数字、下划线或连字符,用于提高URL的可读性。
- 它默认最大长度为50个字符,并且可以用max_length参数自定义。
- 通常,SlugField会有一个unique_for_date参数,用于确保在给定日期范围内slug的唯一性。
URLField()
- URLField 是一个用于存储URL的字符串字段。
- 它默认最大长度为200个字符,也可以用max_length参数自定义。
- 在数据库层面,它通常对应于一个VARCHAR字段。
BooleanField()
- BooleanField 是一个用于存储布尔值(True/False)的字段。
- 它通常用于表示“是/否”或“开/关”这样的二值状态。
- 在数据库层面,通常对应于一个布尔类型。
FileField()
FileField(upload_to=None, max_length=100) - 文件字段
-
upload_to = “/some folder/”:上传文件夹路径
-
max_length = xxxx:文件最大长度
ImageField()
ImageField (upload_to=None, max_length=100,)- 图片字段
- upload_to = “/some folder/”: 指定上传图片路径
关系字段
OneToOneField()
OneToOneField(to, on_delete=xxx, options) - 单对单关系
-
to必需指向其他模型
-
必需指定on_delete选项(删除选项): i.e, “on_delete =
-
models.CASCADE” or “on_delete = models.SET_NULL” .
-
可以设置 “related_name = xxx” 便于反向查询。
ForeignKey()
ForeignKey(to, on_delete=xxx, options) - 单对多关系
-
to必需指向其他模型.
-
必需指定on_delete选项(删除选项): i.e, “on_delete = models.CASCADE” or “on_delete = models.SET_NULL” .
-
可以设置”default = xxx” or “null = True” ;
-
如果有必要,可以设置 “limit_choices_to = “,
-
可以设置 “related_name = xxx” 便于反向查询。
ManyToManyField()
ManyToManyField(to, options) - 多对多关系
- to 必需指向其他模型,比如 User or ‘self’ .
- 设置 “symmetrical = False “ 表示多对多关系不是对称的,比如A关注B不代表B关注A
- 设置 “through = ‘intermediary model’ “ 如果需要建立中间模型来搜集更多信息。
- 可以设置 “related_name = xxx” 便于反向查询。
对于OneToOneField和ForeignKey, on_delete选项和related_name是两个非常重要的设置,前者决定了了关联外键删除方式,后者决定了模型反向查询的名字。
on_delete删除选项
Django提供了如下几种关联外键删除选项, 可以根据实际需求使用。
- CASCADE:级联删除。当你删除publisher记录时,与之关联的所有都会被删除。
- PROTECT: 保护模式。如果有外键关联,就不允许删除,删除的时候会抛出ProtectedError错误,除非先把关联了外键的记录删除掉。
- SET_NULL: 置空模式。删除的时候,外键字段会被设置为空。
- SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值。
- SET(): 自定义一个值。
- DO_NOTHING:什么也不做。删除不报任何错,外键值依然保留,但是无法用这个外键去做查询
related_name选项
- related_name 选项用于指定从相关模型反向引用时的名称。这个选项允许你从一个关系的“另一边”引用对象,而不必直接通过模型的字段名。
from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
在这个例子中,Book 模型有一个指向 Author 模型的 ForeignKey。通过设置 related_name=‘books’,我们可以在 Author 实例上使用 books 属性来获取所有与之相关的 Book 实例。
重要特性
如果没有指定 related_name,Django 会自动创建一个默认的名称,格式为 <model_name>_set,其中 <model_name> 是关系的另一端的模型的小写名称(例如,如果 Book 模型有一个指向 Author 的 ForeignKey,默认的 related_name 将是 book_set)。
如果你的模型被用于多个 ForeignKey 或 ManyToManyField,为每个关系指定一个唯一的 related_name 是一个好的实践,这样可以避免命名冲突。
如果你不希望为关系创建反向名称,可以将 related_name 设置为 ‘+’ 或者 None(在 Django 1.9 及以后版本中)。
示例
class Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='publications')class Article(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles')
在这个例子中,Author 可以通过 publications 属性获取其所有的 Book 实例,通过 articles 属性获取其所有的 Article 实例。
使用 related_name:
author = Author.objects.get(name="Jane Doe")
author_books = author.publications.all() # 获取所有与Jane Doe相关的书籍
author_articles = author.articles.all() # 获取所有与Jane Doe相关的文章
如果不使用 related_name:
author_books = Book.objects.filter(author=author) # 使用默认的related_name
author_articles = Article.objects.filter(author=author) # 使用默认的related_name
模型的META选项
在 Django 中,每个模型都有一个内部类叫做 Meta,它用于包含模型的元数据,即关于模型自身的配置信息。这些元数据不会直接转换为数据库字段,但它们会影响模型的行为,尤其是在数据库层面和 Django 管理界面中的表现。
以下是一些常用的 Meta 选项及其用途:
abstract
类型:布尔值
默认值:False
用途:如果设置为 True,则模型会被视为抽象基类,不会创建对应的数据库表。
app_label
类型:字符串
用途:指定模型所属的应用的名称。通常不需要设置,因为 Django 会自动确定。
db_table
类型:字符串
用途:指定模型在数据库中对应的表名。如果不设置,Django 会自动生成表名,格式为 <app_label>_<model_name>。
db_tablespace
类型:字符串
用途:指定模型使用的数据库表空间。如果数据库支持表空间,这个选项可以用来指定模型表应该使用的表空间。
get_latest_by
类型:字符串或字段名
用途:指定一个字段名,通常是日期或时间字段,以便使用 Model.objects.latest() 方法时按照该字段排序获取最新记录。
managed
类型:布尔值
默认值:True
用途:如果设置为 False,Django 不会为该模型创建或删除数据库表。这在模型映射到预先存在的数据库表或是在非数据库数据源上时很有用。
order_with_respect_to
类型:字段名
用途:用于多对多关系,允许对象根据指定的字段进行排序。
ordering
类型:字符串或字段列表
用途:指定对象默认的排序方式。例如,[‘name’] 表示按照 name 字段的升序排序。
permissions
类型:二元组列表
用途:为模型添加额外的权限。每个元组应该包含两个元素:权限代码和人类可读的权限名称。
proxy
类型:布尔值
默认值:False
用途:如果设置为 True,则模型会被视为代理模型。它将继承其父模型的字段,但不会创建新的数据库表。
unique_together
类型:字段名列表的列表
用途:指定字段组合的唯一性约束。例如,unique_together = [(‘username’, ‘email’)] 表示 username 和 email 的组合必须是唯一的。
verbose_name
类型:字符串
用途:为模型设置一个人类可读的单数名称。
verbose_name_plural
类型:字符串
用途:为模型的复数名称设置一个人类可读的名称。
以下是一个包含 Meta 类的模型示例:
from django.db import modelsclass Person(models.Model):first_name = models.CharField(max_length=50)last_name = models.CharField(max_length=50)class Meta:ordering = ['last_name']verbose_name_plural = "people"
模型的方法
在 Django 中,模型不仅仅是数据库表的简单映射;它们也是具有行为的 Python 对象。你可以为模型添加自定义的方法来执行各种操作,比如计算字段值、处理相关对象,或者执行任何其他需要的业务逻辑。
以下是一些常见类型的模型方法及其用途:
自定义管理器方法
虽然不是直接在模型上定义的,但管理器方法是模型中经常使用的方法。它们允许你对查询集进行自定义操作。
from django.db import modelsclass BookManager(models.Manager):def title_count(self, keyword):return self.filter(title__icontains=keyword).count()class Book(models.Model):title = models.CharField(max_length=100)objects = BookManager()# 使用自定义管理器方法
book_count = Book.objects.title_count('django')
自定义实例方法
这些方法通常用于处理单个模型实例。
class Author(models.Model):name = models.CharField(max_length=100)books = models.ManyToManyField(Book)# book_count 方法返回与特定作者相关的书籍数量。def book_count(self):return self.books.count()
自定义类方法
类方法与实例方法不同,因为它们不需要特定的实例来调用。它们可以用来返回查询集或者执行与特定实例无关的操作。
class Book(models.Model):title = models.CharField(max_length=100)published_date = models.DateField()#recent_books 类方法返回最近30天内发布的书籍。@classmethoddef recent_books(cls):return cls.objects.filter(published_date__gte=datetime.now() - timedelta(days=30))
自定义静态方法
静态方法不依赖于类或实例的状态。它们用于执行一些不访问任何属性或方法的操作。
class Book(models.Model):title = models.CharField(max_length=100)
#is_valid_title 静态方法检查给定的标题是否有效。@staticmethoddef is_valid_title(title):return len(title) > 0
保存和删除钩子
Django 提供了 save 和 delete 方法的钩子,你可以在这些方法中添加自定义逻辑。
class Book(models.Model):title = models.CharField(max_length=100)def save(self, *args, **kwargs):do_something_before_save()super(Book, self).save(*args, **kwargs)do_something_after_save()def delete(self, *args, **kwargs):do_something_before_delete()super(Book, self).delete(*args, **kwargs)do_something_after_delete()
以下是一个综合了上述方法的模型示例:
from django.db import models
from datetime import datetime, timedeltaclass Author(models.Model):name = models.CharField(max_length=100)def get_books(self):return self.book_set.all()class Book(models.Model):title = models.CharField(max_length=100)authors = models.ManyToManyField(Author)published_date = models.DateField()def was_published_recently(self):return self.published_date >= datetime.now() - timedelta(days=30)@classmethoddef get_recent_books(cls):return cls.objects.filter(published_date__gte=datetime.now() - timedelta(days=30))def save(self, *args, **kwargs):if not self.title:raise ValueError("Book must have a title.")super(Book, self).save(*args, **kwargs)
相关文章:
四、Django模型
Model Model (模型) 简而言之即数据模型,是一个Django应用的核心。模型不是数据本身(比如数据表里的数据), 而是抽象的描述数据的构成和逻辑关系。 每个Django的模型(model)实际上是个类,继承了models.Model。每个Model应该包括属性(字段)&…...

Telephony SS
1、补充业务概述 SS是补充服务的缩写,它包含呼叫转移、呼叫限制、呼叫等待、线路识别(CLIR)等。在IMS(IP多媒体子系统)网络中,它使用XCAP(XML配置访问协议)协议通过UT接口操纵SS数据。该协议允许授权用户在连接到IMS或连接到非IMS网络(例如公共互联网)时操纵与服务相…...

【软考】希尔排序算法分析
目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h> #include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;…...

C++(一)----C++基础
1.C的发展史 C语言诞生后,很快普及使用,但是随着编程规模增大且越来越复杂,并且需要高度的抽象和建模时,C语言的诸多短板便表现了出来,为了解决软件危机,上世纪八十年代,计算机界提出了oop&…...
C 语言面试题大汇总之华为面试题
文章目录 1. 局部变量能否和全局变量重名?2. 如何引用一个已经定义过的全局变量?3. 全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?4. 请写出下列代码的输出内容5. static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么区别?s…...

Java:面向对象
继承 继承是一种面向对象编程(OOP)特性,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性(如方法和字段)。通过继承,子类可以复用父类的代…...

【区块链 + 基层治理】腾讯未来社区:区块链业主决策系统 | FISCO BCOS应用案例
腾讯未来社区是腾讯推出的智慧社区综合解决方案,致力于形成“互联网 社区”一站式解决方案,打造智慧社 区健康生态。为了解决物业管理领域的痛点,构建围绕居民、物业、政府和商业四个角色为核心的良好生态,以 信息平台及工具为纽…...
【Rust练习】13.数组
练习题来自:https://practice-zh.course.rs/compound-types/array.html 1 fn main() {// 使用合适的类型填空let arr: __ [1, 2, 3, 4, 5];// 修改以下代码,让它顺利运行assert!(arr.len() 4); }显然这个数组的长度是5. fn main() {// 使用合适的类…...

直流负载技术介绍
直流负载技术是一种用于控制和调节电力系统运行状态的重要技术。它主要通过对电力系统中的直流负载进行有效的管理和控制,以保证电力系统的稳定运行,提高电力系统的运行效率,降低电力系统的运行成本。 直流负载技术主要包括直流负载的检测、…...

FPGA低功耗设计
FPGA低功耗设计 文章目录 FPGA低功耗设计前言一、功耗类型1.1 动态功耗1.2 静态功耗1.3 浪涌功耗 二、系统级低功耗设计2.1 **多电压技术:**即工作频率、电压和功耗的关系2.2 系统时钟分配:2.3 软硬件划分2.4 p 或单元库选择 三、RTL级别低功耗设计3.1 并…...

Python Opencv: 基于颜色提取的印章分割
利用Python实现了一个图像处理功能,即批量提取图像中的印章区域;使用了颜色聚类的方法来提取颜色。 本代码也发布到了github,欢迎大家试用(如果帮助,请star一下): GitHub - AICVHub/seal_seg_o…...
Codeforces Round 970 (Div. 3)(ABCDEF)
Codeforces Round 970 (Div. 3) A:Sakurakos Exams 签到 题意:给定1,2的数量,判断是否能用加减符号使得这些1,2计算出0 void solve() {cin>>n>>m;if(n%2)cout<<"NO\n";else{if(m%20||n)cout<<"YES\n";else cout<<"…...

springboot基于ssm+Jsp的人才招聘网站系统的设计与实现 jw2cs
目录 前言详细视频演示后端技术栈具体实现截图开发核心技术:开发工具核心代码部分展示系统设计操作可行性可行性论证试验方案源码获取 前言 👇🏻 博主介绍:👇🏻 全网粉丝50W,博客专家、CSDN特邀作者、CSDN…...

高质量共建“一带一路”!苏州金龙助力非洲交通驶向共同繁荣之旅
9月6日,中非合作论坛在北京落下帷幕。此次论坛,“高质量共建‘一带一路’”成为重要议题。截止至目前,苏州金龙海格客车已向阿尔及利亚、埃塞俄比亚、南非等所有参与共建“一带一路”的非洲国家累计出口客车14000台。从产品销售,到…...

嵌入式初学-C语言-数据结构--四
栈 1. 基本概念 栈是一种逻辑结构,是特殊的线性表。特殊在: 只能在固定的一端操作 只要满足上述条件,那么这种特殊的线性表就会呈现一种“后进先出”的逻辑,这种逻辑就被称为栈。栈 在生活中到处可见,比如堆叠的盘子…...
【HarmonyOS 4】应用性能优化
1. ArkTs 高性能编程 1.1 ArkTs 高性能编程规则 1.1.1 限制一些 TypeScript 的特性,比如需要不支持属性的动态变更、变量或参数需要明确的类型声明和返回值声明等。1.1.2 禁用 ts-ignore、ts-expect-error 等屏蔽编译校验的命令。1.1.3 开启 TypeScript 的严格模式…...

MySQL——表操作
目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,…...
阅读笔记--Guiding Attention in End-to-End Driving Models(二)
端到端驾驶的注意力学习(Attention Learning for End-to-End Driving)关键内容学习 3.1 问题设置(Problem Setup) 模仿学习(Imitation Learning, IL):介绍了模仿学习的概念,即通过…...
Linux: network: TCP: errno: EWOULDBLOCK
https://mzhan017.blog.csdn.net/article/details/108010013 这个errno的意思: 如果是send接口函数返回的错误,代表tcp socket的sending buffer满了,让应用程序等上一段时间重试send。 所以,这个产生的原因就不固定了: 可能是当前系统太忙,导致系统发包慢,buffer累积; 可…...
闲话“设计模式”
Q1、请详细介绍 软件架构设计模式(智能化),应用程序设计模式(自动化),编程语言设计模式(人性化)(后面括号中 是我 希望 其 具有的特点) 的概念,有…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...