11.16 知识总结(模型层更多内容)

一、 多表查询(跨表查询)

<br class="Apple-interchange-newline"><div></div>

子查询:分步查询
链表查询:把多个有关系的表拼接成一个大表(虚拟表)
    inner join 
    left join
    right join

 1.1 基于双下划线的查询

 # 1 年龄大于35岁的数据
     res = models.User.objects.filter(age__gt=35)
     print(res)
     2 年龄小于35岁的数据
     res = models.User.objects.filter(age__lt=35)
     print(res)
     大于等于 小于等于
     res = models.User.objects.filter(age__gte=32)
     print(res)
     res = models.User.objects.filter(age__lte=32)
     print(res)

     年龄是18 或者 32 或者40
     res = models.User.objects.filter(age__in=[18,32,40])
     print(res)

     年龄在18到40岁之间的  首尾都要
     res = models.User.objects.filter(age__range=[18,40])
     print(res)

     查询出名字里面含有s的数据  模糊查询
     res = models.User.objects.filter(name__contains='s')
     print(res)
    
     是否区分大小写  查询出名字里面含有p的数据  区分大小写
     res = models.User.objects.filter(name__contains='p')
     print(res)
     忽略大小写
     res = models.User.objects.filter(name__icontains='p')
     print(res)

     res = models.User.objects.filter(name__startswith='j')
     res1 = models.User.objects.filter(name__endswith='j')
    
     print(res,res1)


     查询出注册时间是 2020 1月
     res = models.User.objects.filter(register_time__month='1')
     res = models.User.objects.filter(register_time__year='2020')

12 多表查询前期表准备

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)

    # 一对多
    publish = models.ForeignKey(to='Publish')
    # 多对多
    authors = models.ManyToManyField(to='Author')


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
   
    # varchar(254)  该字段类型不是给models看的 而是给后面我们会学到的校验性组件看的

    def __str__(self):
        return self.name


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 一对一
    author_detail = models.OneToOneField(to='AuthorDetail')


class AuthorDetail(models.Model):
    phone = models.BigIntegerField()  # 电话号码用BigIntegerField或者直接用CharField
    addr = models.CharField(max_length=64)

1.3   一对多外键增删改查

 一对多外键增删改查
     增
     1  直接写实际字段 id
     models.Book.objects.create(title='论语',price=899.23,publish_id=1)
     models.Book.objects.create(title='聊斋',price=444.23,publish_id=2)
     models.Book.objects.create(title='老子',price=333.66,publish_id=1)
    2  虚拟字段 对象
     publish_obj = models.Publish.objects.filter(pk=2).first()
     models.Book.objects.create(title='红楼梦',price=666.23,publish=publish_obj)

     删
     models.Publish.objects.filter(pk=1).delete()  # 级联删除

     修改
     models.Book.objects.filter(pk=1).update(publish_id=2)
     publish_obj = models.Publish.objects.filter(pk=1).first()
     models.Book.objects.filter(pk=1).update(publish=publish_obj)

1.4  多对多外键增删改查

 如何给书籍添加作者?
    book_obj = models.Book.objects.filter(pk=1).first()
     print(book_obj.authors)  # 就类似于你已经到了第三张关系表了
     book_obj.authors.add(1)  # 书籍id为1的书籍绑定一个主键为1 的作者
     book_obj.authors.add(2,3)

     author_obj = models.Author.objects.filter(pk=1).first()
     author_obj1 = models.Author.objects.filter(pk=2).first()
     author_obj2 = models.Author.objects.filter(pk=3).first()
     book_obj.authors.add(author_obj)
     book_obj.authors.add(author_obj1,author_obj2)
    """
    add给第三张关系表添加数据
        括号内既可以传数字也可以传对象 并且都支持多个
    """

     删
     book_obj.authors.remove(2)
     book_obj.authors.remove(1,3)

     author_obj = models.Author.objects.filter(pk=2).first()
     author_obj1 = models.Author.objects.filter(pk=3).first()
     book_obj.authors.remove(author_obj,author_obj1)
    """
    remove
        括号内既可以传数字也可以传对象 并且都支持多个
    """


     修改
     book_obj.authors.set([1,2])  # 括号内必须给一个可迭代对象
     book_obj.authors.set([3])  # 括号内必须给一个可迭代对象

     author_obj = models.Author.objects.filter(pk=2).first()
     author_obj1 = models.Author.objects.filter(pk=3).first()
     book_obj.authors.set([author_obj,author_obj1])  # 括号内必须给一个可迭代对象

    """
    set
        括号内必须传一个可迭代对象,该对象内既可以数字也可以对象 并且都支持多个
    """


    # 清空
    # 在第三张关系表中清空某个书籍与作者的绑定关系
    book_obj.authors.clear()
    """
    clear
        括号内不要加任何参数
    
    """

1.5 正反向的概念 

# 正向
# 反向
    外键字段在我手上那么,我查你就是正向
      外键字段如果不在手上,我查你就是反向
  
  book >>>外键字段在书那儿(正向)>>> publish
  publish    >>>外键字段在书那儿(反向)>>>book
  
  一对一和多对多正反向的判断也是如此
  
"""
正向查询按外键字段
反向查询按表名小写
                _set
                ...
"""

二、子查询(基于对象的跨表查询)

# 1.查询书籍主键为1的出版社
     book_obj = models.Book.objects.filter(pk=1).first()
     # 书查出版社 正向
     res = book_obj.publish
    # print(res)
     print(res.name)
     print(res.addr)

     2.查询书籍主键为2的作者
     book_obj = models.Book.objects.filter(pk=2).first()
      书查作者 正向
      res = book_obj.authors  # app01.Author.None
     res = book_obj.authors.all()  # <QuerySet [<Author: Author object>, <Author: Author object>]>
    
     print(res)

     3.查询作者jason的电话号码
     author_obj = models.Author.objects.filter(name='jason').first()
     res = author_obj.author_detail
     print(res)
     print(res.phone)
     print(res.addr)

    """
    在书写orm语句的时候跟写sql语句一样的
    不要企图一次性将orm语句写完 如果比较复杂 就写一点看一点
    
    正向什么时候需要加.all()
        当你的结果可能有多个的时候就需要加.all()
        如果是一个则直接拿到数据对象
            book_obj.publish
            book_obj.authors.all()
            author_obj.author_detail
    """
     4.查询出版社是东方出版社出版的书
     publish_obj = models.Publish.objects.filter(name='东方出版社').first()
     出版社查书  反向
     res = publish_obj.book_set  # app01.Book.None
     res = publish_obj.book_set.all()
     print(res)

     5.查询作者是jason写过的书
     author_obj = models.Author.objects.filter(name='jason').first()
     作者查书      反向
     res = author_obj.book_set  # app01.Book.None
     res = author_obj.book_set.all()
     print(res)

     6.查询手机号是110的作者姓名
     author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
     res = author_detail_obj.author
     print(res.name)
    """
    基于对象 
        反向查询的时候
            当你的查询结果可以有多个的时候 就必须加_set.all()
            当你的结果只有一个的时候 不需要加_set.all()
        自己总结出 自己方便记忆的即可 每个人都可以不一样
    """

   三、 联表查询(基于双下划线的跨表查询)

# 基于双下划线的跨表查询


     1.查询jason的手机号和作者姓名
     res = models.Author.objects.filter(name='jason').values('author_detail__phone','name')
     print(res)
     反向
     res = models.AuthorDetail.objects.filter(author__name='jason')  # 拿作者姓名是jason的作者详情
     res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__name')
     print(res)


     2.查询书籍主键为1的出版社名称和书的名称
     res = models.Book.objects.filter(pk=1).values('title','publish__name')
     print(res)
     反向
     res = models.Publish.objects.filter(book__id=1).values('name','book__title')
     print(res)

     3.查询书籍主键为1的作者姓名
     res = models.Book.objects.filter(pk=1).values('authors__name')
     print(res)
     反向
     res = models.Author.objects.filter(book__id=1).values('name')
     print(res)


     查询书籍主键是1的作者的手机号
    
     book author authordetail
     res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
     print(res)
    """
    你只要掌握了正反向的概念
    以及双下划线
    那么你就可以无限制的跨表
    
    """

四、  聚合查询

常见的统计总数,计算平均值的操作,可以用聚合函数来实现,常见的聚合函数有

  聚合查询通常情况下都是配合分组一起使用的
    只要是跟数据库相关的模块 
        基本上都在django.db.models里面
        如果上述没有那么应该在django.db里面
    """
    from app01 import models
    from django.db.models import Max,Min,Sum,Count,Avg
    # 1 所有书的平均价格
    # res = models.Book.objects.aggregate(Avg('price'))
    # print(res)
    # 2.上述方法一次性使用
    res = models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('pk'),Avg('price'))
    print(res)

五、  分组查询

 MySQL分组查询都有哪些特点
        分组之后默认只能获取到分组的依据 组内其他字段都无法直接获取了
            严格模式
                ONLY_FULL_GROUP_BY
            set global sql_mode='ONLY_FULL_GROUP_BY'
                
    """
    from django.db.models import Max, Min, Sum, Count, Avg
     1.统计每一本书的作者个数
     res = models.Book.objects.annotate()  # models后面点什么 就是按什么分组
     res = models.Book.objects.annotate(author_num=Count('authors')).values('title','author_num')
    """
    author_num是我们自己定义的字段 用来存储统计出来的每本书对应的作者个数
    """
     res1 = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
     print(res,res1)
    """
    代码没有补全 不要怕 正常写
    补全给你是pycharm给你的 到后面在服务器上直接书写代码 什么补全都没有 颜色提示也没有
    
    """

     2.统计每个出版社卖的最便宜的书的价格(作业:复习原生SQL语句 写出来)
     res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
     print(res)

     3.统计不止一个作者的图书
         1.先按照图书分组 求每一本书对应的作者个数
         2.过滤出不止一个作者的图书
     res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
     """
     只要你的orm语句得出的结果还是一个queryset对象
     那么它就可以继续无限制的点queryset对象封装的方法
    
     """
     print(res)

     4.查询每个作者出的书的总价格
    
 res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
    # print(res)

    
"""
    如果我想按照指定的字段分组该如何处理呢?
        models.Book.objects.values('price').annotate()
    后续BBS作业会使用
    
    
    你们的机器上如果出现分组查询报错的情况
        你需要修改数据库严格模式

 六、 F与Q查询

3. 1 F查询

   1.查询卖出数大于库存数的书籍
     F查询
    """
    能够帮助你直接获取到表中某个字段对应的数据
    """
    from django.db.models import F
     res = models.Book.objects.filter(maichu__gt=F('kucun'))
     print(res)


     2.将所有书籍的价格提升500块
     models.Book.objects.update(price=F('price') + 500)


     3.将所有书的名称后面加上爆款两个字
    """
    在操作字符类型的数据的时候 F不能够直接做到字符串的拼接
    """
    from django.db.models.functions import Concat
    from django.db.models import Value
    models.Book.objects.update(title=Concat(F('title'), Value('爆款')))
    # models.Book.objects.update(title=F('title') + '爆款')  # 所有的名称会全部变成空白

  6.2   Q查询

Q查询
    # 1.查询卖出数大于100或者价格小于600的书籍
    # res = models.Book.objects.filter(maichu__gt=100,price__lt=600)
    """filter括号内多个参数是and关系"""
    from django.db.models import Q
    # res = models.Book.objects.filter(Q(maichu__gt=100),Q(price__lt=600))  # Q包裹逗号分割 还是and关系
    # res = models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=600))  # | or关系
    # res = models.Book.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600))  # ~ not关系
    # print(res)  # <QuerySet []>

    # Q的高阶用法  能够将查询条件的左边也变成字符串的形式
    q = Q()
    q.connector = 'or'
    q.children.append(('maichu__gt',100))
    q.children.append(('price__lt',600))
    res = models.Book.objects.filter(q)  # 默认还是and关系
    print(res)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑版微信图片保存在哪个文件夹,如何一次性全选保存

8-7 电脑版的微信聊天&#xff0c;接收到图片后&#xff0c;会保存到微信的个人数据文件夹中&#xff0c;但是有个问题是这些图片都是加密保存的&#xff0c;普通情况下&#xff0c;确实无法人工去取出来&#xff0c;但是下面有方法可以快速将这些图片在脱离微信的情况下&…

盲目跟风考PMP认证?PMP还剩多少含金量?

pmp含金量在如今&#xff0c;含金量还是不错的&#xff0c;但是也不要盲目跟风考&#xff0c;要确定它对你有用&#xff0c;你也会使用它。 什么人适合考PMP? 1、有项目管理实践经验&#xff1a;PMP是基于项目管理实践经验的认证考试&#xff0c;因此有项目管理实践经验的人…

vue3实现数据大屏内数据向上滚动,鼠标进入停止滚动 vue3+Vue3SeamlessScroll

1.效果图 2.npm下载依赖及main.js文件配置 npm install vue3-seamless-scroll --saveimport vue3SeamlessScroll from vue3-seamless-scroll;app.use(vue3SeamlessScroll) 3.html代码 <!-- scrollFlag为true时再渲染,vue3只要涉及到传值子页面需要加flag判断&#xff0c;否…

从哪里下载 Oracle database 11g 软件

登入My Oracle Support&#xff0c;选择Patches & Updates 标签页&#xff0c;点击下方的Latest Patchsets链接&#xff1a; 然后单击Oracle Database&#xff0c;就可以下载11g软件了&#xff1a; 安装单实例数据库需要1和2两个zip文件&#xff0c;安装GI需要第3个zip文…

rsync远程同步(rsync+inotify)

目录 一、概述 1、关于rsync 2、rsync的特点&#xff1a; 3、备份方式&#xff1a; 4、同步方式&#xff1a; 二、rsync相关命令 1、rsync常用命令的选项&#xff1a; 2、启动和关闭rsync服务&#xff1a; 3、关闭 rsync 服务 三、 免交互&#xff1a; 1、免密同步&a…

索引的创建和设计原则

文章目录 1. 索引的声明与使用1.1 索引的分类1.2 创建索引 2. MySQL8.0索引新特性2.1 支持降序索引2.2 隐藏索引 3 哪些情况适合创建索引?3.1 字段的数值有唯一性的限制3.2 频繁作为 WHERE 查询条件的字段3.3 经常 GROUP BY 和 ORDER BY 的列3.4 UPDATE、DELETE 的 WHERE 条件…

(七)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、五种算法&#xff08;DBO、LO、SWO、COA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启…

Linux Traefik工具Dashboard结合内网穿透实现远程访问

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

固有时间尺度分解(Intrinsic Time Decomposition,ITD)

代码教程 固有时间尺度分解(ITD) 代码原理 ITD&#xff08;Intrinsic Time Decomposition&#xff09;是一种信号分解方法&#xff0c;用于将信号分解成多个时频组件。它的基本思想是将信号分解为一组原子函数&#xff0c;这些原子函数具有不同的时频特性。 ITD分解的步骤如下…

在微信公众号怎么实现答题活动

微信公众号答题活动&#xff1a;知识就是力量&#xff0c;答题赢取大奖&#xff01; 你是否厌倦了常规的抽奖活动&#xff1f;是否希望通过更有意义的方式与粉丝互动&#xff1f;现在&#xff0c;微信公众号的全新答题活动来啦&#xff01;不仅可以增加粉丝的粘性&#xff0c;…

【2023云栖】郭瑞杰:阿里云搜索产品智能化升级

本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;郭瑞杰 | 阿里云资深技术专家、搜索负责人 演讲主题&#xff1a;阿里云搜索产品智能化升级发布 近日在2023云栖大会上&#xff0c;阿里云搜索负责人郭瑞杰对阿里云搜索产品智…

java的Exception.getMessage为null

之前捕获异常后调用异常的getMessage写日志&#xff0c;日志写的竟然是null&#xff0c;不可思议。发现要调用异常的getCause().getMessage()才能得到异常信息 刻意把密码改错&#xff0c;让异常直达界面&#xff0c;免得有问题时候只能猜

光伏含氟废水吸附处理

#光伏含氟废水吸附处理 氟的来源是冰晶石、萤石、氟磷灰等矿物&#xff0c;在钢铁、有色金属冶炼、铝、玻璃、化肥等工业领域得到广泛应用。 目前&#xff0c;在太阳能板生产中&#xff0c;一项关键工艺就是将氟化氢溶液浸泡在硅片上&#xff0c;以除去表面的磷硅玻璃&#xf…

把GPT知识库当成记事本,非常有趣的玩法,很欢乐!

1. 笔者创建了一个“每天碎碎念”知识库&#xff0c;把重要的事情保存成文件记录&#xff0c;并进行训练。 2. 这样每当我记不清楚的时候 就开始灵魂发问~ 3. GPT最擅长胡编乱造&#xff0c;万一他忽悠我怎么办&#xff0c;别着急。查看“知识原文”就知道他是否忽悠你了。 这…

qnx 工程目录创建工具 addvariant

文章目录 前言一、addvariant 是什么二、addvariant 使用实例1. variant names 参数说明2. 创建一个可执行文件工程3. 创建一个动态库工程 总结参考资料 前言 本文主要介绍如何在qnx 开发环境中创建工程目录及其相关的配置文件(common.mk, Makefile 文件等) 软件版本&#xff…

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展&#xff0c;各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分&#xff0c;对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

云服务器windows service2022 部署git服务器

1 安装 下载地址gitblit 解压到你的一个目录,我这里给的是C:\gitblit 根据官网提示要下载jre or jdk7.0,这里建议使用下载jre (jdk 有时候运行出问题,或者2个都安装),自行安装java,这里不做环境配置的说明 ==================================== 进入c:\gitblit\data 目录里面…

python科研绘图:帕累托图(Pareto chart)

目录 帕累托图基本构成 绘制帕累托图的步骤 帕累托图&#xff08;Pareto chart&#xff09;是将出现的质量问题和质量改进项目按照重要程度依次排列而采用的一种图表。以意大利经济学家V.Pareto的名字而命名的。帕累托图又叫排列图、主次图&#xff0c;是按照发生频率大小顺序…

Linux安装RabbitMQ详细教程

一、下载安装包 下载erlang-21.3-1.el7.x86_64.rpm、rabbitmq-server-3.8.8-1.el7.noarch.rpm 二、安装过程 1、解压erlang-21.3-1.el7.x86_64.rpm rpm -ivh erlang-21.3-1.el7.x86_64.rpm2、安装erlang yum install -y erlang3、查看erlang版本号 erl -v4、安装socat …

单链表经典OJ题(四)

目录 1、链表中倒数第k个结点 2、消失的数字 3、轮转数组 4、合并两个有序数组 5、数组串联 6、序列中删除指定数字 1、链表中倒数第k个结点 链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com) 这道题依然利用双指针法&#xff0c;具体解题思路如下&#xff1a; 1…