当前位置: 首页 > news >正文

四、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 (模型) 简而言之即数据模型&#xff0c;是一个Django应用的核心。模型不是数据本身&#xff08;比如数据表里的数据), 而是抽象的描述数据的构成和逻辑关系。 每个Django的模型(model)实际上是个类&#xff0c;继承了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){// 划分的数组&#xff0c;例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量&#xff0c;换值int temp;…...

C++(一)----C++基础

1.C的发展史 C语言诞生后&#xff0c;很快普及使用&#xff0c;但是随着编程规模增大且越来越复杂&#xff0c;并且需要高度的抽象和建模时&#xff0c;C语言的诸多短板便表现了出来&#xff0c;为了解决软件危机&#xff0c;上世纪八十年代&#xff0c;计算机界提出了oop&…...

C 语言面试题大汇总之华为面试题

文章目录 1. 局部变量能否和全局变量重名?2. 如何引用一个已经定义过的全局变量?3. 全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?4. 请写出下列代码的输出内容5. static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么区别?s…...

Java:面向对象

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

【区块链 + 基层治理】腾讯未来社区:区块链业主决策系统 | FISCO BCOS应用案例

腾讯未来社区是腾讯推出的智慧社区综合解决方案&#xff0c;致力于形成“互联网 社区”一站式解决方案&#xff0c;打造智慧社 区健康生态。为了解决物业管理领域的痛点&#xff0c;构建围绕居民、物业、政府和商业四个角色为核心的良好生态&#xff0c;以 信息平台及工具为纽…...

【Rust练习】13.数组

练习题来自&#xff1a;https://practice-zh.course.rs/compound-types/array.html 1 fn main() {// 使用合适的类型填空let arr: __ [1, 2, 3, 4, 5];// 修改以下代码&#xff0c;让它顺利运行assert!(arr.len() 4); }显然这个数组的长度是5. fn main() {// 使用合适的类…...

直流负载技术介绍

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

FPGA低功耗设计

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

Python Opencv: 基于颜色提取的印章分割

利用Python实现了一个图像处理功能&#xff0c;即批量提取图像中的印章区域&#xff1b;使用了颜色聚类的方法来提取颜色。 本代码也发布到了github&#xff0c;欢迎大家试用&#xff08;如果帮助&#xff0c;请star一下&#xff09;&#xff1a; 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

目录 前言详细视频演示后端技术栈具体实现截图开发核心技术&#xff1a;开发工具核心代码部分展示系统设计操作可行性可行性论证试验方案源码获取 前言 &#x1f447;&#x1f3fb; 博主介绍&#xff1a;&#x1f447;&#x1f3fb; 全网粉丝50W,博客专家、CSDN特邀作者、CSDN…...

高质量共建“一带一路”!苏州金龙助力非洲交通驶向共同繁荣之旅

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

嵌入式初学-C语言-数据结构--四

栈 1. 基本概念 栈是一种逻辑结构&#xff0c;是特殊的线性表。特殊在&#xff1a; 只能在固定的一端操作 只要满足上述条件&#xff0c;那么这种特殊的线性表就会呈现一种“后进先出”的逻辑&#xff0c;这种逻辑就被称为栈。栈 在生活中到处可见&#xff0c;比如堆叠的盘子…...

【HarmonyOS 4】应用性能优化

1. ArkTs 高性能编程 1.1 ArkTs 高性能编程规则 1.1.1 限制一些 TypeScript 的特性&#xff0c;比如需要不支持属性的动态变更、变量或参数需要明确的类型声明和返回值声明等。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 删除某列 上一篇博客介绍了库的操作&#xff0c;…...

阅读笔记--Guiding Attention in End-to-End Driving Models(二)

端到端驾驶的注意力学习&#xff08;Attention Learning for End-to-End Driving&#xff09;关键内容学习 3.1 问题设置&#xff08;Problem Setup&#xff09; 模仿学习&#xff08;Imitation Learning, IL&#xff09;&#xff1a;介绍了模仿学习的概念&#xff0c;即通过…...

Linux: network: TCP: errno: EWOULDBLOCK

https://mzhan017.blog.csdn.net/article/details/108010013 这个errno的意思: 如果是send接口函数返回的错误,代表tcp socket的sending buffer满了,让应用程序等上一段时间重试send。 所以,这个产生的原因就不固定了: 可能是当前系统太忙,导致系统发包慢,buffer累积; 可…...

闲话“设计模式”

Q1、请详细介绍 软件架构设计模式&#xff08;智能化&#xff09;&#xff0c;应用程序设计模式&#xff08;自动化&#xff09;&#xff0c;编程语言设计模式&#xff08;人性化&#xff09;&#xff08;后面括号中 是我 希望 其 具有的特点&#xff09; 的概念&#xff0c;有…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...