Django学习笔记教程全解析:初步学习Django模型,初识API,以及Django的后台管理系统(Django全解析,保姆级教程)
把时间用在思考上是最能节省时间的事情。——[美]卡曾斯
导言
写在前面
本文部分内容引用的是Django官方文档,对官方文档进行了解读和理解,对官方文档的部分注释内容进行了翻译,以方便大家的阅读和理解。
概述
在上一篇文章里,我们学习了Django的数据库以及拓展数据库的使用以及设置项。这篇文章,我们开始学习Django的模型、API以及后台管理系统的知识。
在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型 - 也就是数据库结构设计和附加的其它元数据。关于API,进入交互式 Python 命令行,尝试一下 Django 为你创建的各种 API。
为你的员工或客户生成一个用户添加,修改和删除内容的后台是一项缺乏创造性和乏味的工作。因此,Django 全自动地根据模型创建后台界面。
Django 产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。站点管理人员使用管理系统来添加新闻、事件和体育时讯等,这些添加的内容被显示在公众页面上。Django 通过为站点管理人员创建统一的内容编辑界面解决了这个问题。管理界面不是为了网站的访问者,而是为管理者准备的。
学习目标
- 认识和学习模型,并初步掌握脚本的编写方法
- 学习模型的激活方法,以及运行数据迁移命令
- 了解并了解Django的API,了解常用的相关命令
- 初步认识后台管理系统,创建Django后台超级管理员以及后台相关知识
模型
概述
一个模型就是单个定义你的数据的信息源。模型中包含了不可缺少的数据区域和你存储数据的行为。在模型中,通过Python类进行描述。
例如,我们现在需要创建两个模型,那么就需要两个Python类,问题 Question 和选项 Choice。Question 模型包括问题描述和发布时间。Choice 模型有两个字段,选项描述和当前得票数。每个选项属于一个问题。
#导入models的包
from django.db import models
"""
定义Python的类,如下面的代码的实例。
自定义的 Model 都必须继承自 django.db.models.Model
"""class Question(models.Model):question_text = models.CharField(max_length=30)pub_date = models.DateTimeField("date published")class Choice(models.Model):question = models.ForeignKey(Question, on_delete=models.CASCADE)choice_text = models.CharField(max_length=200)votes = models.IntegerField(default=0)
模型继承类型的介绍
Django Model 的继承与 Python 类的继承是一样的,只是 Django 要求所有自定义的 Model 都必须继承自 django.db.models.Model。在 Django 中 Model 之间有三种继承模型,它们分别是抽象基类、多表继承以及代理模型。
1. 抽象基类
抽象类继承的作用是将子表中通用的字段聚合在一起,并将这些字段统一定义在抽象基类中,避免于重复定义这些字段。抽象基类的定义通过在模型的 Meta 中定义属性 abstract=True 来实现。示例如下:
from django.db import modelsclass AbstractBase(models.Model):id = models.AutoField()content = models.CharField(max_length=100)username = models.CharField(max_length=80)nowday = models.DateTimeField()class Meta:abstract = Trueclass SomeThing(AbstractBase):testexams = models.CharField(max_length=50)class SomeComment(AbstractBase):level = models.CharField(max_length=20)
2. 多表继承
这是 Django 支持的第二种继承方式,因为每个类都是一个完整的 model,而不属于抽象基类,所以父 model 和子 Model 都会有数据库表,而且 Django 默认会给和子表和父表之间自动创建一个 OneToOneField 数据表关系,并且该字段将作为子表的主键。示例如下:
from django.db import models
class a(A):
testname=models.charFiled(max_length=255,help_text="测试")
3. 代理模型
代理模型用来给父 Model 添加一些方法或者修改其 Meta 选项,但是父 Model 的字段定义不会被修改。我们可以理解为对原父 Model 进行了 Copy,而被 Copy 出来的 Model 就叫做父 Model 的代理模型,但是这个代理模型又有其自己的特点,这相当于 Python 面向对象中的类继承与多态。
class BookExtend(Book):"""BOOK代理模型"""class Meta:ordering=['id'] #定义Meta选项顺序排序按照id字段proxy=True #设置代理模型def __str__(self):return "title:%s pub:%s price:%s" % (self.title, self.pub, self.price) #定义方法
激活你的模型
将APP添加到Django的相关设置中
上面的一小段用于创建模型的代码给了 Django 很多信息,通过这些信息,Django 可以:
- 为这个应用创建数据库 schema(生成 CREATE TABLE 语句)。
- 创建可以与 Question 和 Choice 对象进行交互的 Python 数据库 API。
但是首先得把 polls 应用安装到我们的项目里。
现在,我们要回到settings.py中,修改我们的代码:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls.apps.PollsConfig',
]
数据库的迁移操作
现在你的 Django 项目会包含 polls 应用。接着在终端运行下面的命令:
py manage.py makemigrations polls
这条命令并不会直接执行数据库迁移的操作,而是会检测你对模型文件的修改,并且把修改的部分储存为一次 迁移。
现在,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL:
py manage.py sqlmigrate polls 0001
你将会看到下图的输出:
在官方文档里,重组为我们能看懂的格式,如下:
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,"question_text" varchar(200) NOT NULL,"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,"choice_text" varchar(200) NOT NULL,"votes" integer NOT NULL,"question_id" bigint NOT NULL
);
ALTER TABLE "polls_choice"ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"FOREIGN KEY ("question_id")REFERENCES "polls_question" ("id")DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");COMMIT;
现在,再次运行 migrate 命令,在数据库里创建新定义的模型的数据表:
py manage.py migrate
此时,数据库中多了两张表,如下图:
小结
现在,你只需要记住,改变模型需要这三步:
1、编辑 models.py 文件,改变模型。
2、运行 python manage.py makemigrations 为模型的改变生成迁移文件。
3、运行 python manage.py migrate 来应用数据库迁移。
学习至此,你可以去休息一下,或者消化或者练习一下以上的知识,更快地掌握,不至于很快地忘记你学的知识。掌握并熟练运用一种知识,终究是要勤加练习的,不能偷懒。
分界线以下的知识,本是下一篇文章的内容,为了知识的连贯性,我将它们放在了一起,大家可以自由选择是否学习或者将这里做一个分界线。
人之为学,不日进则日退。——顾炎武
-------------------------------------------------分界线---------------------------------------------
初步认识和使用API
首先,通过以下命令进入交互行:
py manage.py shell
执行这个命令的目的,并不是单单地想要使用python,而是我们需要根据settings.py设置 Python 包的导入路径。并且,进入到这个界面,就可以探索在命令行探索数据库,即使你不懂数据库相关的知识。怎么样,是不是很贴心。
#请在shell交互行尝试以下的命令探索
from polls.models import Choice, Question
#查询表中所有的对象
Question.objects.all()
#输出:<QuerySet []>
from django.utils import timezone
#使用命令向模型传递参数
q = Question(question_text="What's new?", pub_date=timezone.now())
#执行保存命令后,Django会执行SQL的插入语句
q.save()
#查看id
q.id
#输出:1
#查看文本
q.question_text
#输出:"What's new?"
#查看日期
q.pub_date
#输出:datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)
#改变文本内容
q.question_text = "What's up?"
#执行保存后,Django会执行修改操作
q.save()
#查看输出
Question.objects.all()
#输出:<QuerySet [<Question: Question object (1)>]>
讲到这里,大家有没有发现一个问题,貌似<QuerySet [<Question: Question object (1)>]>,这个东西对于我们来讲,并没有什么实质性的帮助。它只能让我们知道里面有东西,但具体是什么却不知道,当然,你完全可以去SQL命令行或者可视化软件里面查看,但是我们今天讨论的是Django的命令行。所以,现在我们要做的事情就是,修复这个问题。
现在让我们会到models这个文件,给 Question 和 Choice 增加 str() 方法。
from django.db import modelsclass Question(models.Model):# ...def __str__(self):return self.question_textclass Choice(models.Model):# ...def __str__(self):return self.choice_text
给模型增加 str() 方法是很重要的,这不仅仅能给你在命令行里使用带来方便,Django 自动生成的 admin 里也使用这个方法来表示对象。
让我们再为此模型添加一个自定义方法,修改models中的代码片段
import datetimefrom django.db import models
from django.utils import timezoneclass Question(models.Model):# ...def was_published_recently(self):return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
保存这些更改并再次运行 python manage.py shell 以启动新的 Python 交互式 shell:
重新运行shell命令行
添加str方法后的变化
from polls.models import Choice, Question
Question.objects.all()
#输出:<QuerySet [<Question: What's up?>]>
使用ID查询
Question.objects.filter(id=1)
#<QuerySet [<Question: What's up?>]>
使用关键字进行模糊查询
Question.objects.filter(question_text__startswith="What")
#<QuerySet [<Question: What's up?>]>
通过时间查询对应的对象信息
from django.utils import timezone
current_year = timezone.now().year
Question.objects.get(pub_date__year=current_year)
#<QuerySet [<Question: What's up?>]>
异常处理
我在操作这部分内容的时候,出现了下面两种错误
1、NameError: name ‘Question’ is not defined
解决方案:导入from polls.models import Choice, Question,导入对应的参数
2、Django (2006, ‘MySQL server has gone away’)
解决方案:重新启动服务器,一般都能解决。
3、执行【Question.objects.get(id=2)】
解决方案:id不存在,创建该字段或者忽略该问题。
通过主键查询
Question.objects.get(pk=1)
#<Question: What's up?>
确保自定义的方法是有效的
q = Question.objects.get(pk=1)
q.was_published_recently()
#输出:True
处理models中的其它类
选项的查询以及创建
现在我们要开始处理我们编写的模型中的第二个Python类:选项。
#给这个问题几个选项,对象,执行INSERT语句,将选择项添加到集合中
#查询id=1的问题,并存储在变量q中
q = Question.objects.get(pk=1)
#显示相关对象集中的任何选项——到目前为止还没有。
q.choice_set.all()
#输出:<QuerySet []>
#创建3个选项
q.choice_set.create(choice_text="Not much", votes=0)
#<Choice: Not much>
q.choice_set.create(choice_text="The sky", votes=0)
#<Choice: The sky>
c = q.choice_set.create(choice_text="Just hacking again", votes=0)
#选择对象可以通过API访问其相关的问题对象。
#确认一下选项对应的问题
c.question
#<Question: What's up?>
q.choice_set.all()
#<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
q.choice_set.count()
#输出:3
#查询
Choice.objects.filter(question__pub_date__year=current_year)
#<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
删除选项的操作
#查询出来需要删除的选项,并存储在变量中
c = q.choice_set.filter(choice_text__startswith="Just hacking")
#执行删除操作
c.delete()
小结
写到这里,有关Django提供的API操作就暂时讨论到这里啦。是不是很便捷,这就是Django的强大指出之一。下面让我们一起走进Django的后台管理系统,为我们更加便捷的开发工作提供便利。
Django 管理页面
概述
为你的员工或客户生成一个用户添加,修改和删除内容的后台是一项缺乏创造性和乏味的工作。因此,Django 全自动地根据模型创建后台界面。
Django 产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。站点管理人员使用管理系统来添加新闻、事件和体育时讯等,这些添加的内容被显示在公众页面上。Django 通过为站点管理人员创建统一的内容编辑界面解决了这个问题。
管理界面不是为了网站的访问者,而是为管理者准备的。
管理页面的配置
创建超级管理员登录账号
要创建登录账号,请执行以下命令:
py manage.py createsuperuser
接着,根据提示创建用户名、电子邮件、密码、确认密码,如下图
由于我们创建的是超级管理员,所以所有的警示信息都可以忽略,直接选择y(是),直接执行即可。电子邮件如果不输入直接回车跳过即可。
管理页面
启动开发服务器
Django 的管理界面默认就是启用的。让我们启动开发服务器,看看它到底是什么样的。如果开发服务器未启动,用以下命令启动它:
py manage.py runserver
访问管理页面并登录
1、请访问你的后台管理地址,例如:http://127.0.0.1:8888/admin/。
2、输入用户名和密码进入后台管理界面,例如admin/123456
向管理页面中加入投票应用
但是我们的投票应用在哪呢?它没在索引页面里显示。只需要再做一件事:我们得告诉管理,问题 Question 对象需要一个后台接口。打开 polls/admin.py 文件,把它编辑成下面这样:
from django.contrib import admin
from .models import Question
admin.site.register(Question)
体验便捷的管理功能
现在我们向管理页面注册了问题 Question 类。Django 知道它应该被显示在索引页里:
点击 “Questions” 。现在看到是问题 “Questions” 对象的列表 “change list” 。这个界面会显示所有数据库里的问题 Question 对象,你可以选择一个来修改。这里现在有我们在上一部分中创建的 “What’s up?” 问题。
点击 “What’s up?” 来编辑这个问题(Question)对象:
变更历史
点击右上角的历史,之后页面如下图所示:
你会看到一个列出了所有通过 Django 管理页面对当前对象进行的改变的页面,其中列出了时间戳和进行修改操作的用户名:
总结
本文将两个课时的内容合为一篇长文章,详尽地讨论了API、模型以及后台管理系统。希望大家可以慢慢消化,认真阅读,有所收获。
下一篇文章,我们将继续深入Django,除了模型,下一篇文章我们将详尽地讲述Django的视图,请大家继续期待。
这一篇文章至此,已经写到末尾,感谢你的阅读和支持,如果允许,请点个赞或使用打赏功能进行鼓励。你的打赏将是我持续更新的动力。
下一篇文章,再见!
人生就象弈棋, 一步失误, 全盘皆输,这是令人悲哀之事;而且人生还不如弈棋,不可能再来一局,也不能悔棋。—— 弗洛伊德
相关文章:

Django学习笔记教程全解析:初步学习Django模型,初识API,以及Django的后台管理系统(Django全解析,保姆级教程)
把时间用在思考上是最能节省时间的事情。——[美]卡曾斯 导言 写在前面 本文部分内容引用的是Django官方文档,对官方文档进行了解读和理解,对官方文档的部分注释内容进行了翻译,以方便大家的阅读和理解。 概述 在上一篇文章里࿰…...
Python学习之路-爬虫提高:selenium
Python学习之路-爬虫提高:selenium 什么是selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)…...

Rust基础拾遗--进阶
Rust基础拾遗 前言1.结构体1.1 具名字段型结构体1.2 元组型结构体1.3 单元型结构体1.4 结构体布局1.5 用impl定义方法1.5.1 以Box、Rc或Arc形式传入self1.5.2 类型关联函数 1.6 关联常量1.7 泛型结构体1.8 带生命周期参数的泛型结构体1.9 带常量参数的泛型结构体1.10 让结构体类…...
数据同步工具对比——SeaTunnel 、DataX、Sqoop、Flume、Flink CDC
在大数据时代,数据的采集、处理和分析变得尤为重要。业界出现了多种工具来帮助开发者和企业高效地处理数据流和数据集。本文将对比五种流行的数据处理工具:SeaTunnel、DataX、Sqoop、Flume和Flink CDC,从它们的设计理念、使用场景、优缺点等方…...

随机过程及应用学习笔记(四) 马尔可夫过程
马尔可夫过程是理论上和实际应用中都十分重要的一类随机过程。 目录 前言 一、马尔可夫过程的概念 二、离散参数马氏链 1 定义 2 齐次马尔可夫链 3 齐次马尔可夫链的性质 三、齐次马尔可夫链状态的分类 四、有限马尔可夫链 五、状态的周期性 六、极限定理 七、生灭过…...

prometheus
文章目录 一、Prometheus简介什么是Prometheus?Prometheus的优势Prometheus的组件、架构Prometheus适用于什么场景Prometheus不适合什么场景 二、相关概念数据模型指标名称和标签样本表示方式 指标类型Counter计数器Gauge仪表盘Histogram直方图Summary摘要 Jobs和In…...

Vi 和 Vim 编辑器
Vi 和 Vim 编辑器 vi 和 vim 的基本介绍 Linux 系统会内置 vi 文本编辑器 Vim 具有程序编辑的能力,可以看做是 Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富&…...

算法沉淀——队列+宽度优先搜索(BFS)(leetcode真题剖析)
算法沉淀——队列宽度优先搜索(BFS) 01.N 叉树的层序遍历02.二叉树的锯齿形层序遍历03.二叉树最大宽度04.在每个树行中找最大值 队列 宽度优先搜索算法(Queue BFS)是一种常用于图的遍历的算法,特别适用于求解最短路径…...

编辑器的新选择(基本不用配置)
Cline 不用看网上那些教程Cline几乎不用配置。 点击设置直接选择Chinese, C直接在选择就行了。 Cline是一个很好的编辑器,有很多懒人必备的功能。 Lightly 这是一个根本不用配置的C编辑器。 旁边有目录,而且配色也很好,语言标准可以自己…...

算法沉淀——栈(leetcode真题剖析)
算法沉淀——栈 01.删除字符串中的所有相邻重复项02.比较含退格的字符串03.基本计算器 II04.字符串解码05.验证栈序列 栈(Stack)是一种基于先进后出(Last In, First Out,LIFO)原则的数据结构。栈具有两个主要的操作&am…...

耳机壳UV树脂制作私模定制耳塞需要注意什么问题?
制作私模定制耳塞需要注意以下问题: 耳模制作:获取准确的耳模是制作私模定制耳塞的关键步骤。需要使用合适的材料和方法,确保耳模的准确性和稳定性。材料选择:选择合适的UV树脂和其它相关材料,确保它们的质量和性能符…...

easyx搭建项目-永七大作战(割草游戏)
永七大作战 游戏介绍: 永七大作战 游戏代码链接:永七大作战 提取码:ABCD 不想水文了,直接献出源码,表示我的诚意...
nginx命名location跳转的模块上下文继承
目录 1. 缘起2. 解决方案2.1 保留指定模块的上下文信息2.2 获取指定模块的上下文信息2.3 设置指定模块的上下文信息2.4 设置模块上下文是否需要继承标记2.5 对openrety lua代码的支持 1. 缘起 nginx提供了非常棒的功能,命名location,如文章nginx的locati…...
洛谷 P2678 [NOIP2015 提高组] 跳石头 (Java)
洛谷 P2678 [NOIP2015 提高组] 跳石头 (Java) 传送门:P2678 [NOIP2015 提高组] 跳石头 题目: [NOIP2015 提高组] 跳石头 题目背景 NOIP2015 Day2T1 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行&…...

第2讲投票系统后端架构搭建
创建项目时,随机选择一个,后面会生成配置properties文件 生成文件 maven-3.3.3 设置阿里云镜像 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more cont…...

Flask 入门7:使用 Flask-Moment 本地化日期和时间
如果Web应用的用户来自世界各地,那么处理日期和时间可不是一个简单的任务。服务器需要统一时间单位,这和用户所在的地理位置无关,所以一般使用协调世界时(UTC)。不过用户看到 UTC 格式的时间会感到困惑,他们…...

FileZilla Server 1.8.1内网搭建
配置环境服务器服务器下载服务器配置服务器配置 Server - ConfigureServer Listeners - Port 协议设置 Protocols settingsFTP and FTP over TLS(FTPS) Rights management(权利管理)Users(用户) 客户端建立连接 配置环境 服务器处于局域网内: 客户端 < -访问- > 公网 &l…...

C++LNK1207中的 PDB 格式不兼容;请删除并重新生成
在打开别人发的C文件时,可能出现该报错 解决办法 打开资源管理器,找到原来的路径 进入Debug, 找到对应的PDB文件删除即可。...

小白学习Halcon100例:如何利用动态阈值分割图像进行PCB印刷缺陷检测?
文章目录 *读入图片*关闭所有窗口*获取图片尺寸*根据图片尺寸打开一个窗口*在窗口中显示图片* 缺陷检测开始 ...*1.开运算 使用选定的遮罩执行灰度值开运算。*2.闭运算 使用选定的遮罩执行灰度值关闭运算*3.动态阈值分割 使用局部阈值分割图像显示结果*显示原图*设置颜色为红色…...

车载诊断协议DoIP系列 —— 车载以太网诊断需求规范(网关、路由)
车载诊断协议DoIP系列 —— 车载以太网诊断需求规范(网关、路由) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...