【9.0】Django框架之模型层
【一】前言
Django自带的sqlite3数据对日期格式不敏感,处理的时候容易出错
【1】测试脚本
-
测试脚本
- 当我们只想要测试Django中的某一个py文件的内容时,我们可以不需要书写前后端交互的形式,而是直接写一个测试脚本即可
-
测试环境的准备
- 在测试文件中书写下面内容
-
这内容其实就是最外部 manage.py 文件中的上面几句话
- 脚本代码无论是写在应用下的 tests.py文件还是自己新建文件,将内容写在新文件中,都会生效
【2】数据准备
- 在models里面创建我们需要的数据库中的表
- 配置数据库文件(settings.py)
- 在项目下的
init.py
中声明数据库类型
【二】单表操作
【1】数据的增加
【2】数据的删除
【3】数据的更改
【补充】查看内部SQL语句的方式
【1】方式一
只有queryset对象才能使用该方法
【4】其他方法总结
【2】方式二
所有 SQL语句 都可以使用
- 在项目的
settings.py
文件中增加默认配置
【三】神奇的双下划线查询
【四】多表查询引入
【1】数据准备
- 重载数据库
【2】外键的增删改查
(1)一对多外键的增删改查
1.1 外键的增加
1.2 外键的删除
1.3 外键的修改
(2)多对多外键的增删改查
多对多 增删改查 就是在操作第三张表
2.1 增加
2.2 删除
支持多个参数/支持对象
2.3 更改
先删除后增加
2.4 清空
【补充】正反向的概念
-
正向
- 外键字段在我手上,那么我查你就是正向
- book >>>> 外键字段在书这边(正向) >>>> 出版社
-
反向
- 外键字段不在我手上,那么我查你就是反向
- 出版社>>>> 外键字段在书这边(反向) >>>> book
-
一对一和一对多的判断也是这样
正向查询按字段
反向查询按表明名(小写)
__set
...
【五】多表查询
【1】子查询(基于对象的跨表查询)
【补充】_set.all()
(反向查询)
- 查询结果是多个的时候需要加
- 查询结果是多个的时候需要加
【2】联表查询(基于双下划线的跨表查询)
【六】聚合查询
【七】分组查询
【八】F与Q查询
【1】F查询
【2】Q查询
【九】Django中如何开启事务
【1】ACID是数据库事务的四个关键特性
-
它代表了原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
-
原子性(Atomicity):
-
事务被视为一个不可分割的原子操作单元。
-
这意味着要么全部操作成功并永久保存,要么全部操作失败并回滚到事务开始前的状态,不存在部分成功或部分失败的情况。
-
-
一致性(Consistency):
-
事务在执行前后,数据库都必须保持一致状态。
-
这意味着事务执行前后,数据库中的数据必须满足所有定义的完整性约束,例如列级别的约束、外键关系等。
-
-
隔离性(Isolation):
-
事务之间应该相互隔离,每个事务的执行应该与其他事务的执行相互独立,互不干扰。
-
隔离性确保了多个事务可以并发执行,而不会产生不一致的结果。
-
-
持久性(Durability):
- 一旦事务成功提交后,其所做的修改将永久保存在数据库中,即使发生系统故障或重启,数据也能够恢复到提交后的状态。
- 持久性通过将事务日志写入非易失性存储介质来实现,如硬盘驱动器或固态硬盘。
-
【2】Django中如何开启事务
【十】ORM中常用的字段及参数
AutoField
- int自增列,必须填入参数 primary_key=True。
- 当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
- 一个整数类型
- 范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
BigIntegerField(IntegerField)
- 长整型(有符号的)
- 范围在 -9223372036854775808 ~ 9223372036854775807
CharField
-
字符类型,必须提供max_length参数, max_length表示字符长度。
-
verbox_name 标识字段的注释
EmailField(CharField)
- varchar(254)
DecimalField(Field)
- max_digits,小数总长度
- decimal_places,小数位长度
TextField(Field)
- 文本类型
- 支持大段内容,无字数限制
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "/data"
- 给该字段传一个文件对象,会自动将文件保存到 /data 目录下,然后将文件路径保存到数据库中
BooleanField(Field)
- 字段为布尔值
- 数据库里面可以存 0/1
DateField
- 日期字段
- 日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField
- 日期时间字段
- 格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
DateField和DateTimeField
auto_now_add
- 配置auto_now_add=True
- 创建数据记录的时候会把当前时间添加到数据库。
auto_now
- 配置上auto_now=True
- 每次更新数据记录的时候会更新该字段。
ForeignKey
- 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
- ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
to
- 设置要关联的表
to_field
- 设置要关联的表的字段
on_delete
- 当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
- 删除关联数据,与之关联也删除
OneToOneField
- 一对一字段。
- 通常一对一字段用来扩展已有字段。(通俗的说就是一个人的所有信息不是放在一张表里面的,简单的信息一张表,隐私的信息另一张表,之间通过一对一外键关联)
to
- 设置要关联的表。
to_field
- 设置要关联的字段。
on_delete
- 当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)
【字段参数】
null
用于表示某个字段可以为空。
unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
【对应关系】
【支持自定义字段】
【十一】数据库查询优化
- ORM语句的特点
- 惰性查询:如果仅仅是书写了ORM语句,在后面没有使用到的话就不会对数据库进行查询,当我们需要用到查询的数据时,ORM会从数据库查询数据并返回数据
- only/defer
- select_related /prefetch_related
【1】only与defer
- 在数据库查询中,
only
和defer
是两个常用的方法- 用于优化查询性能和减少数据传输量。
only
only
方法允许我们指定只查询我们需要的字段,而忽略其他字段。通过只选择必要的字段,可以减少数据库返回的数据量,从而提高查询速度和减少网络传输开销。在Django ORM中,可以使用.only()
方法来限定查询字段。
例如,假设我们有一个名为Product
的模型,其中包含许多字段,但我们只对名称和价格感兴趣。我们可以使用only
方法来只选择这两个字段:
defer
defer
方法与only
相反,它允许我们延迟加载某些字段,将它们从查询中排除。这在我们有一些大的、不常用的字段时非常有用,可以避免在每次查询时都加载这些字段,从而提高查询性能。在Django ORM中,可以使用.defer()
方法来延迟加载字段。
例如,假设我们有一个名为Product
的模型,其中包含一个很大的description
字段,但我们只在特定情况下使用它。我们可以使用defer
方法将其从查询中排除:
【2】select_related 与 prefetch_related
在数据库查询中,
select_related
和prefetch_related
是两个常用的方法用于解决查询中的关联对象性能问题。
select_related
select_related
方法用于减少数据库查询次数,通过在查询时同时加载相关联的对象。例如,如果我们有一个Product
模型,其中包含一个外键字段category
,我们可以使用select_related
方法来在查询产品时一起加载其所属的类别信息:
这样一来,当我们访问每个产品的category
属性时,不会再触发额外的数据库查询,提高了查询效率。
prefetch_related
prefetch_related
方法则是用于解决一对多或多对多关系的性能问题。当我们查询包含关联对象集合(例如一个订单和其包含的商品)时,prefetch_related
方法可以一次性加载所有的关联对象,避免了N+1查询问题。
这样一来,在访问每个订单对应的产品集合时,不会再触发额外的查询操作,大大提高了查询性能。
需要注意的是,使用select_related
和prefetch_related
方法时,需谨慎选择要加载的关联对象,避免过度加载导致的性能问题,同时也要注意数据库索引的优化以提高查询效率。
【十二】choice参数(数据库字段设计常见)
【1】引入
以一张信息表为例
-
针对某个可以列举完全的可能性字段,我们应该如何存储?
-
只要某个字段的可能性是列举完全的,那么一般情况下都会采用choice参数
【2】数据准备
【3】问题解决
(1)gender字段存的数字在上述元祖列举的范围内
没有报错,且第四条已经插入到数据库中
(2)gender字段存的数字在上述元祖列举的范围内并获取
(3)gender字段存的数字不在上述元祖列举的范围内
【4】总结
-
choice参数使用场景非常广泛
-
例如
- 支付方式的选择
- 生源的来源地
- 分数的分类
- 学历的分类
- ...
【十三】MTV与MVC模型
- MTV模型和MVC模型是两种常见的软件设计模式,用于组织和管理用户界面和应用程序的逻辑。
- 虽然它们存在一些相似之处,但它们在设计和应用上有一些不同。
【1】MTV模型:
MTV模型是指Model-Template-View(模型-模板-视图)模型,是Django框架中采用的一种设计模式。它的核心思想是将应用程序分为三个主要部分:
-
模型(Model):
- 模型表示应用程序中处理数据的结构和行为。
- 它通常与数据库交互,并定义了数据的存储和操作方式。
-
模板(Template):
- 模板负责处理用户界面的显示。
- 它定义了应用程序的外观和布局,并将动态数据与静态页面结合在一起,生成最终的用户界面。
-
视图(View):
- 视图处理应用程序的逻辑和业务流程。
- 它接收用户的请求,从模型中获取数据,将数据传递给模板进行渲染,并生成响应返回给用户。
MTV模型的优点在于它可以很好地将应用程序的逻辑和用户界面进行分离,使代码更容易维护和扩展。
【2】MVC模型:
MVC模型是指Model-View-Controller(模型-视图-控制器)模型,是一种常见的软件设计模式,广泛应用于Web开发和其他应用程序中。
-
模型(Model):
- 模型负责处理应用程序的数据逻辑。
- 它包含了数据的存储和操作方式,并定义了数据在应用程序内部如何交互和被操作。
-
视图(View):
- 视图是用户界面的表示,负责展示数据给用户并接收用户的输入操作。
- 它通常从模型中获取数据,并将其显示给用户。
-
控制器(Controller):
- 控制器处理用户的交互和请求,并根据用户的行为作出相应的响应。
- 它接收用户的输入,并更新模型和视图以反映用户的操作。
MVC模型的优点在于它可以很好地分离应用程序的不同组件,使得代码更易于维护、测试和重用。
【3】总结:
- MTV模型主要用于Django框架中,通过将应用程序分为模型、模板和视图,提供了一种清晰的架构方案。
- MVC模型则是一个通用的设计模式,广泛应用于各种类型的应用程序中。
- 无论使用哪种模型,都能帮助开发者更好地组织和管理代码,并实现可扩展和可维护的应用程序。
【十四】多对多三种创建方式
【1】全自动
- 利用ORM自动帮我们创建第三张表关系
- 优点
- 代码不需要自己写,非常方便,还支持ORM提供操作第三张表的方法
- 缺点
- 第三张关系表的扩展性极差(没办法添加额外字段)
【2】纯手动(不建议使用)
- 优点
- 第三张表完全取决于自己进行额外的拓展
- 缺点
- 需要写代码较多
- 不能使用ORM提供的相关方法
【3】半自动
- 这样虽然可以使用ORM的正反向查询,但是没法使用add,set,remove,clear这四个方法
__EOF__

本文链接:https://www.cnblogs.com/dream-ze/p/17559613.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17559613.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY