(万字长文)Django数据库操作——ORM:数据交互显示前端网页
🌟 如果这篇文章触动了你的心弦,请不要吝啬你的支持!
亲爱的读者,
感谢你花时间阅读这篇分享。希望这里的每一个字都能为你带来启发或是让你会心一笑。如果你觉得这篇文章有价值,或者它解决了你一直以来的一个疑问,请给个赞吧 —— 这不仅是对我学习效果的认可,更是激励我继续前行的动力!
而且,如果你不想错过未来更多有趣的内容,记得点击关注哦!这样,每当有新文章发布时,你就能第一时间收到通知啦。让我们一起在这个充满无限可能的知识海洋中遨游,探索未知的世界吧!
最后,别忘了留下你的想法或问题在评论区。无论是赞美、建议还是疑问,我都非常期待听到你的声音。也许,正是你的那条评论,将开启一段全新的讨论旅程呢!
🌟 点赞、关注、留言 —— 三连走起,让我们共同成长,一起变得更优秀!
再次感谢每一位可爱的你,愿你在追求梦想的路上一帆风顺!
接续上篇文章:Django的请求和响应+template模板-CSDN博客
目录
🌟 如果这篇文章触动了你的心弦,请不要吝啬你的支持!
4.4.8 orm——连接Mysql数据库
1.Django开发操作数据库更为简单:orm
2.安装第三方模块
3.创建数据库
4.连接MySql的配置
5.Django操作表
6.操作表中的数据(增、删、改、查)
一、增加数据
二、删除数据
三、修改数据
四、查询数据
如何在Django中使用ORM进行数据的批量插入?
7.用户管理(案例):
4.4.8 orm——连接Mysql数据库
1.Django开发操作数据库更为简单:orm
orm本身是不能连接数据库的,也需要通过工具:pymsql、MySqldb
orm扮演角色:翻译官(代码翻译成为相应的MySql数据)
2.安装第三方模块
pip install mysqlclient
如果安装不了:就采用whl包的方式
下载链接:mysqlclient · PyPI
3.创建数据库
ORM作用:数据库需要自己创建
-
操作(创建、修改、删除)数据库表
-
操作表中的数据:(不用写sql语句)
使用工具:NAvicat可视化创建数据库
4.连接MySql的配置
修改项目 settings.py:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 使用 MySQL 引擎'NAME': 'django_project', # 数据库名(需提前创建)'USER': 'username', # 数据库用户名'PASSWORD': 'password', # 数据库密码'HOST': 'localhost', # 数据库主机(默认本地)'PORT': '3306', # 端口(默认 3306)'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", # 严格模式(可选)'charset': 'utf8mb4' # 字符集(推荐 utf8mb4)}} }
注意事项:
-
使用 pymysql 替代 mysqlclient
(若 mysqlclient 安装失败):
-
安装 pymysql:
pip install pymysql
-
在项目同名目录(与settings.py同级)的init.py中添加:
import pymysql pymysql.install_as_MySQLdb()
-
最后操作效果:
-
auth_group
-
用途:存储用户组信息。
-
字段示例:
-
id
:组的唯一标识符。 -
name
:组的名称。
-
-
auth_group_permissions
-
用途:关联用户组与权限的关系。
-
字段示例:
-
id
:关系记录的唯一标识符。 -
group_id
:所属用户组的 ID。 -
permission_id
:关联的权限 ID。
-
-
auth_permission
-
用途:存储系统中的所有权限信息。
-
字段示例:
-
id
:权限的唯一标识符。 -
name
:权限的名称。 -
content_type_id
:关联的内容类型 ID(即哪个模型拥有该权限)。 -
codename
:权限的代码名称,用于程序中引用。
-
-
auth_user
-
用途:存储用户的基本信息。
-
字段示例:
-
id
:用户的唯一标识符。 -
username
:用户名。 -
password
:加密后的密码。 -
email
:邮箱地址。 -
is_staff
、is_superuser
:是否为管理员或超级用户。 -
date_joined
:注册日期。
-
-
auth_user_groups
-
用途:关联用户与用户组的关系。
-
字段示例:
-
id
:关系记录的唯一标识符。 -
user_id
:所属用户的 ID。 -
group_id
:关联的用户组 ID。
-
-
auth_user_user_permissions
-
用途:关联用户与权限的关系。
-
字段示例:
-
id
:关系记录的唯一标识符。 -
user_id
:所属用户的 ID。 -
permission_id
:关联的权限 ID。
-
-
django_admin_log
-
用途:记录后台管理系统的操作日志。
-
字段示例:
-
id
:日志记录的唯一标识符。 -
action_time
:操作时间。 -
user_id
:执行操作的用户 ID。 -
content_type_id
:被操作对象的内容类型 ID。 -
object_id
:被操作对象的 ID。 -
object_repr
:被操作对象的表示字符串。 -
action_flag
:操作类型(如添加、修改、删除)。 -
change_message
:变更描述。
-
-
django_content_type
-
用途:存储应用中所有模型的内容类型信息。
-
字段示例:
-
id
:内容类型的唯一标识符。 -
app_label
:所属应用的标签。 -
model
:模型名称。
-
-
django_migrations
-
用途:记录数据库迁移的历史。
-
字段示例:
-
id
:迁移记录的唯一标识符。 -
app
:迁移的应用名称。 -
name
:迁移文件的名称。 -
applied
:迁移应用的时间。
-
-
django_session
-
用途:存储用户的会话信息。
-
字段示例:
-
session_key
:会话键。 -
session_data
:会话数据(通常为序列化后的字典)。 -
expire_date
:会话过期时间。
-
5.Django操作表
创建表:
from django.db import models class UserInfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField()
执行命令:
python manage.py makemigrationspython manage.py migrate
注意:app必须是要已经注册了的
上图中,之所以会有其他的表,是因为Django内置了的,如下图:
一旦不想使用有些表,就直接注释掉即可。
创建和修改表结构:
直接在models.py文件里面添加class结构。
如果在原有创建表的基础上进行添加新的字段:
size = models.IntegerField()
那么就会如图所示,进行选择。
1)→代表的就是让你一个一个去填写对应字段值
2)→代表的就是退出如果在 models.IntegerField()的括号中加入default=3值,那么就是默认键值
3)允许为空:
data = models.IntegerField(null = True,blank=true)
所以以后在开发过程中:想要修改表中的“字段”
通过修改app下的models.py文件中的class中的代码进行注释即可,然后在进行以下命令:
python manage.py makemigrations python manage.py migrate
6.操作表中的数据(增、删、改、查)
在 Django 中,通过 ORM(对象关系映射)可以方便地对数据库表中的数据进行增、删、改、查操作。前面我们已经定义了几个模型类,如下所示:
from django.db import models # 用户信息模型类 class UserInfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField() # 部门模型类 class Department(models.Model):title = models.CharField(max_length=16) # 角色模型类 class Role(models.Model):caption = models.CharField(max_length=16)
一、增加数据
-
使用
create
方法 通过模型类.objects.create(字段=值)
的方式可以快速创建一条数据记录。例如前面已经使用过的创建部门数据。
Department.objects.create(title = "销售部")
这会在Department
表中插入一条title
为 “销售部” 的记录。
如果要创建UserInfo
表的数据,可以这样写:
UserInfo.objects.create(name="张三", password="123456", age=25)
上述代码会在UserInfo
表中插入一条用户名为 “张三”,密码为 “123456”,年龄为 25 岁的记录。
-
先实例化再保存 也可以先实例化一个模型对象,然后调用其
save
方法来保存到数据库。比如创建Role
表的数据:
role_obj = Role(caption="管理员") role_obj.save()
这种方式在需要对对象进行一些额外处理后再保存时比较有用,例如给对象的某些属性动态赋值等。
二、删除数据
-
使用
delete
方法 对于已经获取到的模型对象实例,可以调用其delete
方法来删除对应的数据记录。假设我们已经获取到了一个UserInfo
对象:
user = UserInfo.objects.get(name="张三") # 先获取到名为“张三”的用户对象 user.delete() # 删除该用户记录
也可以通过查询集批量删除数据。比如删除所有年龄小于 20 岁的用户:
UserInfo.objects.filter(age__lt=20).delete()
这里filter
方法筛选出符合条件(年龄小于 20 岁)的查询集,然后调用delete
方法将这些记录全部删除。
三、修改数据
-
先获取对象再修改属性并保存 先从数据库中获取到要修改的模型对象,然后修改其属性值,最后调用
save
方法保存修改。例如修改 “销售部” 部门名称为 “市场销售部”:
department = Department.objects.get(title="销售部") department.title = "市场销售部" department.save()
-
使用
update
方法批量修改 如果要批量修改满足一定条件的数据,可以使用update
方法。比如将所有用户的年龄都增加 1 岁:
UserInfo.objects.all().update(age=models.F('age') + 1)
这里models.F
对象用于在不获取具体值的情况下对字段进行操作,实现直接在数据库层面的计算更新。
四、查询数据
使用get
方法获取单个对象 get
方法用于获取满足特定条件的单个对象。例如获取名为 “张三” 的用户:
user = UserInfo.objects.get(name="张三")
注意,如果查询结果不存在或者存在多条满足条件的记录,get
方法会抛出异常(DoesNotExist
或MultipleObjectsReturned
)。
使用filter
方法获取查询集 filter
方法用于获取满足条件的多个对象,返回的是一个查询集。例如获取所有年龄大于 30 岁的用户:
users = UserInfo.objects.filter(age__gt=30) for user in users:print(user.name, user.age)
这里age__gt=30
表示筛选条件为年龄大于 30 岁,__gt
是 Django ORM 中的查询运算符,表示 “大于”。类似的还有__lt
(小于)、__gte
(大于等于)、__lte
(小于等于)等。
使用all
方法获取所有对象 all
方法用于获取模型表中的所有记录,返回查询集。例如获取所有部门:
departments = Department.objects.all() for department in departments:print(department.title)
使用exclude
方法排除某些对象 exclude
方法用于排除满足特定条件的对象,返回剩余的查询集。例如获取除了 “管理员” 角色之外的其他角色:
roles = Role.objects.exclude(caption="管理员") for role in roles:print(role.caption)
通过以上这些增、删、改、查操作,我们可以灵活地管理数据库表中的数据,充分发挥 Django ORM 的便捷性和强大功能。
如何在Django中使用ORM进行数据的批量插入?
在 Django 中使用 ORM 进行数据的批量插入,通常使用bulk_create
方法,以下是详细步骤:
1. 定义模型
首先要定义 Django 模型类,它对应数据库中的表结构。例如,定义一个存储书籍信息的模型:
from django.db import models class Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=50)publish_year = models.IntegerField()
2. 准备数据
准备要批量插入的数据,一般以列表形式呈现,列表中的每个元素是一个字典,字典的键对应模型字段名,值为要插入的数据。例如:
books_data = [{"title": "Python基础教程","author": "张三","publish_year": 2020},{"title": "Django实战指南","author": "李四","publish_year": 2022},{"title": "Web开发入门","author": "王五","publish_year": 2021} ]
3. 执行批量插入
使用bulk_create
方法进行数据插入。先将准备好的数据转换为模型实例,再调用该方法:
# 创建模型实例 book_instances = [Book(title=book["title"], author=book["author"], publish_year=book["publish_year"]) for book in books_data] # 执行批量插入 Book.objects.bulk_create(book_instances)
也可以更简洁地写成:
Book.objects.bulk_create([Book(title=book["title"], author=book["author"], publish_year=book["publish_year"]) for book in books_data])
4. 验证插入结果
可以通过查询数据库来验证数据是否成功插入:
all_books = Book.objects.all() for book in all_books:print(book.title, book.author, book.publish_year)
注意事项
-
事务处理:
bulk_create
默认在单个事务中执行,这意味着要么所有数据都插入成功,要么都失败回滚,适用于不需要逐条验证的场景 。 -
信号发送:
bulk_create
不会发送 Django 的post_save
信号,如果业务逻辑依赖此信号,需要手动处理。 -
性能考量:当数据量非常大时,可以通过设置
batch_size
参数分批次插入,以避免占用过多内存。例如:
batch_size = 100 for i in range(0, len(book_instances), batch_size):batch = book_instances[i:i + batch_size]Book.objects.bulk_create(batch)
bulk_create
相比逐条插入(如使用循环调用save
方法),能显著减少数据库交互次数,提升插入效率,尤其适合处理大量数据的场景。
7.用户管理(案例):
views.py: def user_list(request):"""用户列表页"""users = User.objects.all()return render(request, 'user_list.html', {'users': users}) def user_add(request):"""添加用户"""if request.method == 'POST':form = UserForm(request.POST)if form.is_valid():form.save()messages.success(request, '用户添加成功!')return redirect('user_list')else:form = UserForm()return render(request, 'user_add.html', {'form': form}) def user_edit(request, pk):"""编辑用户"""user = get_object_or_404(User, pk=pk)if request.method == 'POST':form = UserForm(request.POST, instance=user)if form.is_valid():form.save()messages.success(request, '用户更新成功!')return redirect('user_list')else:form = UserForm(instance=user)return render(request, 'user_edit.html', {'form': form, 'user': user}) def user_delete(request, pk):"""删除用户"""user = get_object_or_404(User, pk=pk)if request.method == 'POST':user.delete()messages.success(request, '用户删除成功!')return redirect('user_list')return render(request, 'user_confirm_delete.html', {'user': user})
urls.py:path("user/user_list", user_list, name="user_list"),path("user/user_add", user_add, name="user_add"),path("user/user_edit/<int:pk>/", user_edit, name="user_edit"),path("user/user_delete/<int:pk>/", user_delete, name="user_delete"),
base.url: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>用户管理系统</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> </head> <body><div class="container mt-5">{% if messages %}{% for message in messages %}<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">{{ message }}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button></div>{% endfor %}{% endif %}{% block content %}{% endblock %}</div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> </body> </html>
user_list.html: {% extends 'base.html' %} {% block content %} <div class="card"><div class="card-header"><h3 class="card-title">用户列表</h3><!-- 去掉 'users:' 前缀 --><a href="{% url 'user_add'%}" class="btn btn-primary float-end">添加用户</a></div><div class="card-body"><table class="table table-striped table-hover"><thead><tr><th>ID</th><th>用户名</th><th>邮箱</th><th>性别</th><th>年龄</th><th>状态</th><th>创建时间</th><th>操作</th></tr></thead><tbody>{% for user in users %}<tr><td>{{ user.id }}</td><td>{{ user.username }}</td><td>{{ user.email }}</td><td>{{ user.get_gender_display }}</td><td>{{ user.age|default:"-" }}</td><td>{% if user.is_active %}<span class="badge bg-success">激活</span>{% else %}<span class="badge bg-danger">禁用</span>{% endif %}</td><td>{{ user.created_at|date:"Y-m-d H:i" }}</td><td><!-- 去掉 'users:' 前缀 --><a href="{% url 'user_edit' user.pk %}" class="btn btn-sm btn-warning">编辑</a><a href="{% url 'user_delete' user.pk %}" class="btn btn-sm btn-danger">删除</a></td></tr>{% endfor %}</tbody></table></div> </div> {% endblock %}
user_add.html: {% extends 'base.html' %} {% block content %} <div class="card"><div class="card-header"><h3 class="card-title">添加用户</h3></div><div class="card-body"><form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit" class="btn btn-primary">保存</button><a href="{% url 'user_list' %}" class="btn btn-secondary">取消</a></form></div> </div> {% endblock %}
user_confirm_delete.html: {% extends 'base.html' %} {% block content %} <div class="card"><div class="card-header"><h3 class="card-title">确认删除</h3></div><div class="card-body"><p>你确定要删除用户 "{{ user.username }}" 吗?</p><form method="post">{% csrf_token %}<button type="submit" class="btn btn-danger">确认删除</button><a href="{% url 'user_list' %}" class="btn btn-secondary">取消</a></form></div> </div> {% endblock %}
user_edit.html: {% extends 'base.html' %} {% block content %} <div class="card"><div class="card-header"><h3 class="card-title">编辑用户: {{ user.username }}</h3></div><div class="card-body"><form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit" class="btn btn-primary">保存</button><a href="{% url 'user_list' %}" class="btn btn-secondary">取消</a></form></div> </div> {% endblock %}
效果图:
相关文章:

(万字长文)Django数据库操作——ORM:数据交互显示前端网页
🌟 如果这篇文章触动了你的心弦,请不要吝啬你的支持! 亲爱的读者, 感谢你花时间阅读这篇分享。希望这里的每一个字都能为你带来启发或是让你会心一笑。如果你觉得这篇文章有价值,或者它解决了你一直以来的一个疑问&a…...

实验-使用递归计算阶乘-RISC-V(计算机组成原理)
目录 一、实验内容 二、实验步骤 三、实验效果 四、实验环境 五、实验小结和思考 一、实验内容 一个典型的计算阶乘的递归过程如下图所示: 在这个任务中,一份汇编代码的框架“task4-阶乘”你需要使用RISC-V或MIPS汇编程序以递归的形式解决这个问题。…...

ISO 26262-5 评估硬件架构度量值
两种硬件架构的度量, 用于评估相关项架构应对随机硬件失效的有效性。 应评估(评估仅限于ASIL (B)、 C 和 D 的安全目标) 1 应将按照附录 C 单点故障度量和潜伏故障度量的诊断覆盖率来评估 2 应结合残余故障和相关的潜伏故障来预估安全机制…...
JMeter 教程:响应断言
目录 JMeter 教程:响应断言的简单介绍【轻松上手】 ✅ 什么是响应断言? 📌 使用场景示例 🛠️ 添加响应断言步骤 1. 选中 HTTP 请求 → 右键 → Add → Assertions → Response Assertion 2. 设置断言内容: ✅ …...

【Qt开发】显示类控件——QLCDNumber
目录 1,QLCDNumber的说明 2,QLCDNumber的运用 1,QLCDNumber的说明 QLCDNumer 是一个专门用来显示数字的控件。它类似于 "老式计算器" 的效果。它的核心属性如下: 2,QLCDNumber的运用 定时器 运用QLCDNumb…...
深入剖析 5G 核心网中的 PLMN
一、引言 在 5G 技术迅猛发展的当下,5G 核心网作为整个通信系统的关键枢纽,支撑着海量数据传输、低延迟通信以及多样化业务应用。其中,公共陆地移动网络(Public Land Mobile Network,PLMN)扮演着极为重要的角色,它是 5G 核心网实现用户接入、网络管理以及业务提供的基础…...

音频AAC编码与RV1126的AENC模块的讲解
一.音频编码的原理 AAC编码的基本概念 AAC(Advanced Audio Coding)是一种高级音频编码格式,旨在提供比MP3更高的音质和更低的比特率。AAC是MPEG-2和MPEG-4标准的一部分,广泛应用于音乐、视频流媒体和广播等领域 音频为什么要进…...

vue页面目录菜单有些属性是根据缓存读取的。如果缓存更新了。希望这个菜单也跟着更新。
父组件中有两个子组件。如果在B组件数据更新之后。A组件也跟着一起改变呢?如图如果我右边基本信息里面勾选了高血压,左侧菜单里面也要立刻出现一个高血压随访菜单,如果我取消勾选了左侧菜单就去掉。 左侧菜单的显示和隐藏的数据实际上是放在…...
Android开发-Application
在Android应用开发中,Application类扮演着非常重要的角色。它作为整个应用程序的全局单例实例存在,在应用启动时最先被创建,并且在整个应用生命周期内持续存在。通过自定义Application类,开发者可以执行全局初始化操作、管理全局状态或数据等。本文将详细介绍Application的…...

在TIA 博途中下载程序时找不到对应的网卡怎么办?
1. 检查物理连接 确认网线已正确连接PLC和PC,接口指示灯正常。 尝试更换网线或交换机端口,排除硬件故障。 2. 确认网卡驱动已安装 设备管理器检查: 右键点击“此电脑” → “管理” → “设备管理器”。 展开“网络适配器”,确…...

《量子计算实战》PDF下载
内容简介 在加密、科学建模、制造物流、金融建模和人工智能等领域,量子计算可以极大提升解决问题的效率。量子系统正变得越来越强大,逐渐可用于生产环境。本书介绍了量子计算的思路与应用,在简要说明与量子相关的科学原理之后,指…...

Linux入门(部分基础相关知识+常用命令+权限)
目录 1.基础背景了解 2、基本操作系统、linux相关知识 1.操作系统是一款用来管理软硬件资源的软件。 2.对于一个文件来说,是由文件内容文件属性构成的。空文件(内容为空)也占磁盘空间。 3.linux下的目录结构 4.linux下的删除 5.环境 6…...

海拔案例分享-实践活动报名测评小程序
大家好,今天湖南海拔科技想和大家分享一款实践活动报名测评小程序,客户是长沙一家专注青少年科创教育的机构,这家机构平时要组织各种科创比赛、培训课程,随着学员增多,管理上的问题日益凸显:每次组织活动&a…...
JavaWeb面试题 (一)
1. 常见的软件系统结构 1. C/S C/S结构即客户端/服务器(Client/Server),例如QQ; 缺点:软件更新时需要同时更新客户端和服务器端两端,比较麻烦; 优点:安全性比较好 2. B/S B/S结…...
解决Vue项目依赖错误:使用electron-vite重建
文章目录 开端解决方案:使用 electron-vite Vue 重建项目1. 环境准备2. 创建新项目3. 安装依赖并启动项目 开端 在开发过程中,我遇到了一个令人头疼的错误提示: 0:0 error Parsing error: Cannot find module vue/cli-plugin-babel/preset…...
vue3样式穿透用法
在Vue3中,样式穿透可通过以下方式实现: 1. 基础用法 使用::v-deep伪类实现样式穿透(兼容Vue2语法): .parent ::v-deep .child-component {color: red; }2. 推荐方式 使用:deep()伪函数(Vue3推荐写法&am…...
Puppeteer 浏览器自动化操作工具
pyppeteer 是 Python 版本的 Puppeteer,而 Puppeteer 是由 Google 开发的一个 Node.js 库,用于控制 Chrome 或 Chromium 浏览器。pyppeteer 允许你通过 Python 代码自动化操作浏览器,实现网页爬取、自动化测试、生成截图或 PDF 等功能。 核心…...
5G 网络寻呼的信令及 IE 信息分析
一、寻呼信令的触发背景 在 5G 网络中,当网络侧有下行数据要发送给处于空闲态(RRC_IDLE)或非激活态(RRC_INACTIVE)的用户设备(UE)时,就会触发寻呼流程。这是因为在这些状态下,UE 与网络之间没有建立持续的无线资源控制(RRC)连接,网络需要通过寻呼机制来通知 UE 有…...
信奥赛CSP动态规划入门-最小硬币问题
针对**“最小硬币问题”**的详细分步解析与程序实现,通过将大问题分解为小问题的方式讲解动态规划的应用: 一、问题拆解步骤 1. 明确问题定义 大问题:用面值1元和5元的硬币凑出N元,最少需要多少枚硬币? 小问题&#…...

cmd里可以使用npm,vscode里使用npm 报错
cmd里可以使用npm,vscode里使用npm 报错 报错提示原因解决方法 报错提示 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系 统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/ fwlink/?LinkID135170 中的 about_Executi…...

JAVA开发工具延长方案
亲测稳定的延长方案与避坑指南 真的搞不懂了,说点专业的术语竟然成了 QINQUAN。那就直接点,把这个方案带给需要的开发者。 延长工具直通车 保姆级教程 延长方案https://mp.weixin.qq.com/s/uajM2Y9Vz6TnolzcLur_bw还是让大家看看,发什么会被…...

CSS 浮动(Float)及其应用
1. 什么是浮动(Float)? 浮动元素会脱离正常的文档流(Document Flow),并向左或向右移动,直到碰到父元素的边缘或另一个浮动元素。 基本语法 .float-left {float: left; }.float-right {float:…...

CC53.【C++ Cont】一维前缀和
目录 1.定义 2.作用 3.例题:【模板】一维前缀和 分析 方法1:暴力解法 方法2:前缀和(简单的动态规划) 第一步:预处理 4.练习:P1115 最大子段和 分析 方法1:段长从1枚举到n 方法2:改进方法1 代码 提交结果 1.定义 快速求出数组中某一段的区间和,时间复杂度为(速度极…...
Python爬虫实战:研究Grab 框架相关技术
1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。如何高效地获取和利用这些数据成为了当前的研究热点。网络爬虫作为一种自动获取网页内容的技术,能够按照一定的规则,自动地抓取万维网信息,在搜索引擎、数据挖掘、信息整合等领域有着广泛的…...
每日leetcode
1502. 判断能否形成等差数列 - 力扣(LeetCode) 题目 给你一个数字数组 arr 。 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列,请返回 true …...

YouTube视频字幕转成文章算重复内容吗?
很多创作者误以为「自己说的话不算抄袭」,却不知道YouTube自动生成的字幕早已被搜索引擎存档。 去年就有案例:某美食博主将教程视频字幕转为图文,结果原创度检测仅42%,导致页面权重暴跌。 本文揭秘5个实操技巧:从删除…...

网络学习-利用reactor实现http请求(六)
一、实现HTTP请求 1、印象里面,总有人说C/C语言不能实现HTTP请求,其实不然。C/C语言完全可以实现HTTP请求。通过对select,poll,epoll等IO多路复用技术的学习以及reactor模式的学习,完全能够实现HTTP请求。 2、webserver 主要解决两个问题 …...
云原生安全:IaaS安全全解析(从基础到实践)
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念:IaaS的核心价值与安全边界 1.1 什么是IaaS? 基础设施即服务(Infrastructure as a Service)是云计算的基础层,提供虚拟机、存储、网络等基础资源。用户通过…...

【IC_Design】跨时钟域的寄存器更新后锁存
目录 设计逻辑框图场景概述总结电路使用注意事项***波形图代码 设计逻辑框图 场景概述 最典型的应用场景就是——在一个时钟域(比如 CPU/总线域)更新了一个多位配置字,需要把它安全地送到另一个时钟域(比如时钟发生器、串口、视频…...
Spring AI 之提示词
提示词(Prompts)是引导人工智能(AI)模型生成特定输出的输入内容。这些提示词的设计和措辞会显著影响模型的响应。 在 Spring AI 中,与 AI 模型进行交互的最低层级上,处理提示词的方式与 Spring MVC 中管理“视图”(View)有些相似。这涉及创建包含动态内容占位符的冗长…...