Django基础之(7) - ORM系统:多表操作
1|0一、创建模型
1|11.1 一对一的关系
1|21.2 多对多的关系
要查询所有作者
1|31.3 关于多对多表的三种创建方式(目前你作为了解)
1.3.1 方式一:自行创建第三张表
1.3.2方式二:通过ManyToManyField自动创建第三张表
1.3.3 方式三:设置ManyTomanyField并指定自行创建的第三张表(称为中介模型)
注意:
-
当我们需要在第三张关系表中存储额外的字段时,就要使用第三种方式,第三种方式还是可以使用多对多关联关系操作的接口(all、add、clear等等)
-
当我们使用第一种方式创建多对多关联关系时,就无法使用orm提供的set、add、remove、clear方法来管理多对多的关系了。
1|41.4 相关参数
1.4.1 一对一关系相关字段(OneToOneField)
通常一对一字段用来扩展已有字段。
示例:一对一的关联关系多用在当一张表的不同字段查询频次差距过大的情况下,将本可以存储在一张表的字段拆开放置在两张表中,然后将两张表建立一对一的关联关系。
字段参数
1.4.2 一对多关系相关字段(ForeignKey)
1.4.3 多对多关系相关字段
1.4.4 元信息
获取元信息,可以通过model对象._meta.verbose_name等获取自己通过verbose_name指定的表名,model对象._meta.model_name获取小写的表名,还有model对象.app_label可以获取这个对象的app应用名等等操作。例如:book_obj = models.Book.objects.get(id=1),book_obj._meta.model_name。
1.4.5 关于on_delete(了解)
2|0二、创建数据
实例:我们来假定下面这些概念,字段和关系
作者模型:一个作者有姓名和年龄。
作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(OneToOne)
出版商模型:出版商有名称,所在城市以及email。
书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(ManyToMany);一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(ForeignKey)。
模型建立如下:
2|13.2 一对多
2|23.3 多对多
多对多关系其它常用API:
删除示例:
一对一和一对多的删改和单表的删改是一样的,别忘了删除表的时候,咱们是做了级联删除的。
3|0四、基于对象的跨表查询
3|14.1 一对多查询(Publish 与 Book)
3|24.2 一对一查询(Author 与 AuthorDetail)
3|34.3 多对多查询(Author 与 Book)
注意:
4|0五、基于双下划线的跨表查询(基于join实现的)
4|15.1 一对多查询
4|25.2 多对多查询
4|35.3 一对一查询
4|45.4 进阶练习(连续跨表)
4|55.5 related_name
5|0六、聚合查询、分组查询、F查询和Q查询
5|16.1 聚合
aggregate(*args, **kwargs)
,只对一个组进行聚合
计算所有图书的平均价格
5|26.2 分组
annotate():
为QuerySet
中每一个对象都生成一个独立的汇总值。
是对分组完之后的结果进行的聚合,结果是queryset类型
单标分组查询
多表分组查询
总结:
- annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值(统计方法用聚合函数)。
- 跨表分组查询本质就是将关联表join成一张表,再按单表的思路进行分组查询。
6|0七、F查询与Q查询
6|17.1 F查询
在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?我们在book表里面加上两个字段:评论数:commentNum,收藏数:KeepNum
Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
修改操作也可以使用F函数,比如将每一本书的价格提高30元:
6|27.2 Q查询
filter()
等方法中的关键字参数查询都是一起进行AND
的。 如果你需要执行更复杂的查询(例如OR
语句),你可以使用Q 对象
。
6|3传入条件进行查询
6|4合并条件进行查询
6|5与或非
Q
对象可以使用&(与)
、|(或)、~(非)
操作符组合起来。当一个操作符在两个Q
对象上使用时,它产生一个新的Q
对象。
等同于下面的SQL WHERE
子句:
你可以组合&
和|
操作符以及使用括号进行分组来编写任意复杂的Q
对象。同时,Q
对象可以使用~
操作符取反,这允许组合正常的查询和取反(NOT
) 查询:
查询函数可以混合使用Q 对象
和关键字参数。所有提供给查询函数的参数(关键字参数或Q
对象)都将"AND”在一起。但是,如果出现Q
对象,它必须位于所有关键字参数的前面。例如:
7|0八、ORM 执行原生 sql 语句(了解)
在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询。
Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。
7|18.1 执行原生查询
可以像下面这样执行原生SQL语句
raw()查询可以查询其他表的数据。
raw()方法自动将查询字段映射到模型字段。还可以通过translations参数指定一个把查询的字段名和ORM对象实例的字段名互相对应的字典
原生SQL还可以使用参数,注意不要自己使用字符串格式化拼接SQL语句,防止SQL注入!
7|28.2 直接执行自定义SQL
8|0九、打印sql
即为你的Django项目配置上一个名为django.db.backends的logger实例即可查看翻译后的SQL语句。
9|0十、Python脚本中调用Django环境(django外部脚本使用models)
__EOF__

本文链接:https://www.cnblogs.com/dongye95/p/13814929.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!