Django回顾5 - 多表操作、其它字段和字段参数、中间表的三种创建方式

【1】多表操作

  • 基于对象跨表查(子查询)
    • 执行两句sql语句,没有连表操作
  • 基于双下划线的连表查
    • 一次查询,连表操作

【2】聚合查询(aggregate)

  • 聚合函数
    • Min、Max、sum、Avg、Count

aggregate是 QuerySet 的一个终止子句,用来做聚合查询

 

Book.objects.all().aggregate(Avg('price'))

【3】分组查询(annotate)

分组查询一般和聚合查询组合使用、annotate用来分组和聚合的

  • annotate
    • filter在annotate前:表示过滤,where条件
    • values在annotate前:表示分组的字段,如果不写表示按整个表分组
    •  filter在annotate后:表示 having条件
    • values在annotate后:表示取字段---》只能取分组字段和聚合函数字段

分组目的:

        把有相同特征的分成一组,分成一组后一般用来:统计总条数,统计平均数,求最大值

【4】F查询

F查询:拿到某个字段在表中具体的值

 

示例:

        

 from django.db.models import FBook.objects.filter(评论数__gt=F('收藏数'))-让所有图书价格 +1Book.objects.all().update(price=F('price')+1)

【5】Q查询

Q查询:为了组装成  与  或  非 条件

 

-与条件:and条件,在filter中直接写---》就是and条件
            Book.objects.filter(authors__name="lqz",price=100)


-或条件:Book.objects.filter(Q(authors__name="lqz")|Q(authors__name="justin"))


-非条件:Book.objects.filter(~Q(name='红楼梦'))
        
-复杂逻辑:(名字为红楼梦并且价格大于100) 或者 id 大于 2


        Book.objects.filter((Q(name='红楼梦') & Q(price__gt=100))|Q(nid__gt=2))

【6】其它字段和字段参数

     【6.1】字段参数:ORM字段参数

  • null
    • 表示某个字段可以为空。
  • unique
    • 如果设置为unique=True 则该字段在此表中必须是唯一的
  • db_index
    • db_index=True 则代表着为此字段设置索引
  • default
    • 为该字段设置默认值。
  • DateField和DateTimeField
    • auto_now_add=True:新增会把当前时间存入
    • default=datatime.datatime.now
    • auto_now=True,每次更新数据记录的时候会更新该字段
  • verbose_name
    • 提示,该字段的作用
  • blank 
    • Admin中是否允许用户输入为空
  • editable 
    • Admin中是否可以编辑
  • help_text
    • Admin中该字段的提示信息
  • choices
    • Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
    • 路由写法:get_字段名_display()

【6.2】ForeignKey属性

  • to
    • 设置要关联的表
  • to_field
    • to_field 设置要关联的表的字段
  • related_name
    • 反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’
  • related_query_name
    • 反向查询操作时,使用的连接前缀,用于替换表名
  • on_delete:当删除关联表中的数据时,当前表与其关联的行的行为
    • models.CASCADE
      • 删除关联数据,与之关联也删除
    • models.DO_NOTHING
      • 删除关联数据,引发错误IntegrityError
    • models.PROTECT
      • 删除关联数据,引发错误ProtectedError
    • models.SET_NULL
      • 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
    • models.SET_DEFAULT
      • 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
    • models.SET:删除关联数据
      • 与之关联的值设置为指定值,设置:models.SET(值)
      • 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    • db_constraint
      • 是否在数据库中创建外键约束,默认为True
      • db_constraint=False  在数据库中不建立外键约束
      • 虽然不建立数据库外键约束---》但是orm查询,继续用
    • ManyToManyField
      • 用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系
      • to
        • 设置要关联的表,中间是有个中间表的,区别于一对多
      • related_name
        • 同ForeignKey字段
      • related_query_name
        • 同ForeignKey字段
      • through
        • 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系
        • 但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名
      • through_fields
        • 设置关联的字段
      • db_table
        • 默认创建第三张表时,数据库中表的名称

【7】中间表创建的三种方式

        第一种:自动创建

自动创建用不到throughthrough_field 

 

authors = models.ManyToManyField(to='关联的表名')

        第二种:半自动创建

手动创建中间表,使用through指定

 

 三张表都要手动创建--》3个类--》3个表模型---》
    # 什么情况会使用手动创建?----中间表如果有多的字段,都是手动创建
    # authors=models.ManyToManyField(to='Author',through='booktoauthor', through_fields=('当前表--》到中间表的外键关系','剩下的写在第二个位置'))

 

半自动:自己创建第三张表,利用 ManyToManyField 在某张表指定关联关系
优点:可以自定义字段,依旧支持基于双下划线、对象的反向查询,可扩展性高
多对多字段的方法不支持了(add,set,remove,clear)
class Book(models.Model):...authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))class Author(models.Model):...books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author', 'book'))class Book2Author(models.Model):book = models.ForeignKey(to='Book')author = models.ForeignKey(to='Author')create_time = models.DateField(auto_now_add=True)# through 告诉 django orm 书籍表和作者表的多对多关系是通过 Book2Author 来记录的# through fields 告诉 django orm 记录关系时用过 Book2Author 表中的 book 字段 和 author字段 来记录的(第一个参数 book 是  关联表查 book 所依赖的字段)# 但是,多对多字段的 add set remove clear 四个方法就用不了了
# 1.半自动 一定要加两个额外的参数through='Book2Author', through_fields=('book','author')
# 2.后面字段的顺序由第三张表通过哪个字段查询单表 就把哪个字段放前面

        第三种,纯手动创建

不使用ManyToManyField关联

 

纯手动:手动创建第三张表,然后利用 Foreignkey 自己做两张表的关联
优点:第三张表可以新增任意字段,扩展性较高
不足:查询不方便,基于双下划线、对象的反向查询都不支持了class Book(models.Model):...class Author(models.Models):...class Book2Author(models.Model):book_id = models.ForeignKey(to='Book')author_id = models.ForeignKey(to='Author')create_time = models.DateField(auto_now_add=True)...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

deepin v20 在线安装docker

deepin v20 在线安装docker 删除docker,如果有的话: sudo apt-get -y remove docker docker-engine docker.io containerd runc让apt支持https sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-c…

竞赛选题YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…

36.位运算符

一.什么是位运算符 按照二进制位来进行运算的运算符叫做位运算符,所以要先将操作数转换成二进制(补码)的形式在运算。C语言的中的位运算符有: 运算符作用举例结果& 按位与(and) 0&00; 0&10; …

Linux进程间通信——共享内存

Linux进程间通信——共享内存 1、创建/打开共享内存1.1 shmget1.2 ftok 2、关联和接触关联2.1 shmat2.2 shmdt 3、删除共享内存3.1 shmctl 3.2 相关shell命令3.3 共享内存状态4、进程间通信5、shm和mmap的区别 原文链接 共享内存不同于内存映射区,它不属于任何进程…

leetcode 117. 填充每个节点的下一个右侧节点指针 II

看了两三次的leetcode 117. 填充每个节点的下一个右侧节点指针 II 题目 给定一个二叉树: struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#x…

基于现代学徒制的大数据技术与应用人才培养模式探讨

学生学徒制的实施旨在解决当前新技术企业招聘技能人才难和青年就业难的结构性矛盾,通过生态链链主企业携手院校共同解决毕业年度学生就业问题,按照学生个人意愿,建立以就业导向的学生学徒制关系,签订学徒培养协议确定学生就业岗位…

【Java基础】几种拼接字符串的方法

几种拼接字符串的方法 1.使用 "" 运算符拼接字符串2.使用 StringBuilder 或 StringBuffer 类3.使用 StringJoiner 类4.使用 String 类 join 方法5.使用 StringUtils 类6.使用 String 类 concat 方法7.使用 String.format() 方法格式化字符串8.使用 Stream 实现9.总结…

Python-图片去重

直接上代码 # 修改一下第34行文件夹路径以及13行图片后缀名即可使用 import os from hashlib import md5def remove_duplicate_images(folder_path):image_files []duplicate_images set()# 遍历文件夹,找到所有 JPG 图片文件for root, dirs, files in os.walk(f…

VUE项目中问题学习总结(一)

文章目录 🍁自定义组件使用🍁clearInterval函数的使用🌿定时器的作用 🍁localStorage的使用🌿设置数据🌿获取数据🌿更新数据🌿删除数据 🍁VUE国际化配置🍁项目…

智能优化算法应用:基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑猩猩算法4.实验参数设定5.算法结果6.参考文献7.…

Proteus8.16仿真软件安装图文教程(Proteus 8 Professional)

Proteus8.16 🔧软件安装包下载链接:🔧视频教程🔧1 安装软件解压🔧2 安装🔧3 破解🔧4 汉化 🔧软件安装包下载链接: Proteus8.16软件下载链接 1、本文关于Proteus8.16 SP…

双击热备方案实现(全)

双击热备是应用与服务器的一种解决方案,其构造思想是主机和从机通过TCP/IP网络连接,正常情况下主机处于工作状态,从机处于监视状态,一旦从机发现主机异常,从机将会在很短的时间内代替主机。完全实现主机的功能。 要想实…

golang之net/http模块学习

文章目录 开启服务开启访问静态文件获取现在时间按时间创建一个空的json文件按时间创建一个固定值的json文件 跨域请求处理输出是json 开启服务 package mainimport ("fmt""net/http" )//路由 func handler(w http.ResponseWriter, r *http.Request){fmt.…

2023年多元统计分析期末试题

一、简答题 1、试述距离判别法、Fisher判别法和贝叶斯判别法的异同。 二、 2、设 X {X} X~ N 2 {N_2} N2​(μ,Σ),其中 X {X} X ~ ( X 1 {X_1} X1​, X 2 {X_2} X2​, X 3 {X_3} X3​),μ ( μ 1 {μ_1} μ1​, μ 2 {μ_2} …

2024不收费的数据恢复软件EasyRecovery16

EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…

bfs P2895 [USACO08FEB] Meteor Shower S

[P2895 USACO08FEB] Meteor Shower S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) bfs。难点在于处理走到该点时的时间与该处陨石降落的时间的比较。 可以发现,在某处可能有多个陨石降落,但是此题只考虑陨石降落的最小时间。因此,我们可…

测试:JMeter和LoadRunner比较

比较 JMeter和LoadRunner是两款常用的软件性能测试工具,它们在功能和性能上有一定的相似性和差异。下面从几个方面对它们进行比较: 1. 架构和原理: JMeter和LoadRunner的架构和原理基本相同,都是通过中间代理监控和收集并发客户…

软件测试【理论基础】

软件测试的IEEE定义:使用人工或自动的手段来运行或测量软件系统的过程,目的是检验软件系统是否满足规定的需求,并找出与预期结果之间的差异。 软件测试的发展趋势: ① 测试工作将进一步前移。软件测试不仅仅是单元测试、集成测…

数据结构算法-插入排序算法

引言 玩纸牌 的时候。往往 需要将牌从乱序排列变成有序排列 这就是插入排序 插入排序算法思想 先看图 首先第一个元素 我默认已有序 那我们从第二个元素开始,依次插入到前面已有序的部分中。具体来说,我们将第二个元素与第一个元素比较,…

软件工程 单选多选补充 复刻

原文 软件的主要特性:无形、高成本、包括程序和文档 软件工程三要素:方法、工具、过程 螺旋模型包含风险分析 软件工程的主要目标:风险分析 面向对象开发:Booch、UML、Coad、OMT 软件危机的主要表现:软件成本太高…