返回顶部
首页 > 资讯 > 后端开发 > Python >Django 系列博客(十二)
  • 511
分享到

Django 系列博客(十二)

系列博客Django 2023-01-30 23:01:07 511人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询。 聚合查询 语法:aggregate(*args, **kwargs) # 计算所有图书的平均价格 from djanGo.db.mode

前言

本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询。

聚合查询

语法:aggregate(*args, **kwargs)

# 计算所有图书的平均价格
from djanGo.db.models import Avg
Book.objects.all().aggregate(Avg('price'))

aggregate()是 QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值得标识符,值是计算出来的聚合值。建的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定个名称,可以向聚合子句提供它。

Book.objects.aggregate(average_price=Avg('price'))

如果你希望生成不止一个聚合值,你可以向 aggregate()子句中添加另一个参数。所以如果想知道所有图书价格的最大值和最小值,可以这样查询:

from django.db.models import Avg, Max, Min
Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))

具体例子:

# 查询所有书籍的平均价格
from django.db.models import Avg,Count,Max,Min
ret=Book.objects.all().aggregate(Avg('price'))
# {'price__avg': 202.896}
# 可以改名字
ret=Book.objects.all().aggregate(avg_price=Avg('price'))
# 统计平均价格和最大价格
ret=Book.objects.all().aggregate(avg_price=Avg('price'),max_price=Max('price'))
# 统计最小价格
ret = Book.objects.all().aggregate(avg_price=Avg('price'), min_price=Min('price'))
# 统计个数和平均价格
ret = Book.objects.all().aggregate(avg_price=Avg('price'), max_price=Max('price'),count=Count('price'))
ret = Book.objects.all().aggregate(avg_price=Avg('price'), max_price=Max('price'),count=Count('nid'))
print(ret)

分组查询

总结

group by 那个表就以那个表作为基表
values 在前:表示 group by
values 在后:表示取值
filter 在前:表示 where 条件
filter 在后:表示 having

分组查询案例

# 查询所有作者写的书的总价格大于26的
# filter()在annotate后面,表示对分组后的结果进行筛选,相当于having
# annotate前的values()表示按该字段分组,相当于group by,可以省略,默认会按Author的id分组
# 后面的values()表示取值
ret=Author.objects.all().values('pk').annotate(s=Sum('book__price')).filter(s__gt=26).values('name','s')

等价于

ret=Author.objects.all().annotate(s=Sum('book__price')).filter(s__gt=26).values('name','s')
# 查询各个作者出的书的总价格
# s相当于给求和结果取名字,在vlaues取值中,可以引用
ret = Author.objects.all().annotate(s=Sum('price')).values('name','s')
print(ret)
# 统计不止一个作者的图书
ret=Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c')
print(ret)

等价于

ret = Book.objects.annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name','author_num')
print(ret)

F 查询

什么是 F 查询

如果要对两个字段的值作比较,就不能直接比较,必须借助 F()的实例,可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

语法

from django.db.models import F
fliter(commit_num_gt=F('read_num'))

F 查询的使用

# 查询评论数大于阅读数的书
book = models.Book.objects.filter(commit_num__gt=F('read_num')).values('name')

# 把所有书的评论数加1
models.Book.objects.all().update(commit_num=F('commit_num')+1)

Q 查询

什么是 Q 查询

对两个字段的值进行或、与、非运算,不能直接运算,需要用 Q()的实例。

语法

# 且  ----->  &
# 或  ----->  |
# 非  ----->  ~
from django.db.models import Q
fliter(Q(name='tom')|Q(name='tony'))

Q 查询的使用

# 查询不是tom写的书的名字
ret = models.Book.objects.filter(~Q(authors__name='tom')).values('name')

# 查询作者名字是tom或者名字是tony的书
ret = models.Book.objects.filter(Q(authors__name='tom')|Q(authors__name='tony')).values('name')

补充:

在实际开发中,外键通常不用:

  • 约束性太强
  • 查询效率低
  • 可以通过db_constraint=False来取消外键约束,在 ORM 创建表的时候,外键的约束不会存在,但是这样会产生脏数据。

  • 建外键约束,包括 unique 都是为了不产生脏数据。

--结束END--

本文标题: Django 系列博客(十二)

本文链接: https://lsjlt.com/news/180849.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Django 系列博客(十二)
    前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询。 聚合查询 语法:aggregate(*args, **kwargs) # 计算所有图书的平均价格 from django.db.mode...
    99+
    2023-01-30
    系列 博客 Django
  • Django 系列博客(十三)
    前言 本篇博客介绍 Django 中的常用字段和参数。 ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True。当 model 中如果没有自增列,则会自动创建一个列名为 id 的列。 Integ...
    99+
    2023-01-30
    系列 博客 Django
  • Django 系列博客(二)
    前言 今天博客的内容为使用 Django 完成第一个 Django 页面,并进行一些简单页面的搭建和转跳。 命令行搭建 Django 项目 创建纯净虚拟环境 在上一篇博客中已经安装好了虚拟环境,所以用虚拟环境来安装指定版本的 Djang...
    99+
    2023-01-30
    系列 博客 Django
  • Django 系列博客(三)
    前言 本篇博客介绍 django 的前后端交互及如何处理 get 请求和 post 请求。 get 请求 get请求是单纯的请求一个页面资源,一般不建议进行账号信息的传输。 配置路由 from django.conf.urls impo...
    99+
    2023-01-30
    系列 博客 Django
  • Django 系列博客(四)
    前言 本篇博客介绍 django 如何和数据库进行交互并且通过 model 进行数据的增删查改 ORM简介 ORM全称是:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库...
    99+
    2023-01-30
    系列 博客 Django
  • Django 系列博客(一)
    前言 学习了 python 这么久,终于到了Django 框架。这可以说是 python 名气最大的web 框架了,那么从今天开始会开始从 Django框架的安装到使用一步步的学习,这系列博客不会像前端的那样水了(立个 flag),希望...
    99+
    2023-01-30
    系列 博客 Django
  • python+django博客simbl
    概述本博客系统基于Django-1.7.7开发而成,通过nginx+uwsgi运行于locvps,Python版本为 2.7.6。功能    1.文章、分类和页面的增删改查;    2.文章按年、月归档;    3.集成simditor富文...
    99+
    2023-01-31
    博客 python django
  • 基于django的个人博客网站建立(二)
    前言 今天主要完成后台管理员登录的状态以及关于文章在后台的处理 具体内容 首先接上一次内容,昨天只是完成了一个登录的跳转,其他信息并没有保存到session中,今天先完善一下 在用户登录时,先设置了一下session request....
    99+
    2023-01-31
    博客网站 django
  • 利用Python Django实现简单博客系统
    第一节 - 基础 1. 简单的导览图,学会不迷路 对 Django 的评价:借用李清照的《鹧鸪天 桂花》来表达, 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。 梅定妒,菊应羞。画阑开处冠中秋。骚...
    99+
    2022-06-02
    Python Django实现博客系统 Python Django
  • Django 博客开发教程 15 -
    在 使用 Nginx 和 Gunicorn 部署 Django 博客 中,我们通过手工方式将代码部署到了服务器。整个过程涉及到十几条命令,输了 N 个字符。一旦我们本地的代码有更新,整个过程又得重复来一遍,这将变得非常繁琐。 使用 Fab...
    99+
    2023-01-31
    教程 博客 Django
  • Python采用Django开发自己的博客系统
    好久之前就想做一下自己的博客系统了,但是在网上查了查好像是需要会一些Node.js的相关知识,而且还要安装辣么多的库什么的,就不想碰了。但是我遇到了Django这么一款神器,没想到我的博客系统就这么建立起来...
    99+
    2022-06-04
    自己的 系统 博客
  • Django搭建个人博客:前言
    Django是一个由Python写成的开源Web应用框架,可以用它以更快的速度、更少的代码,搭建一个高性能的网站。 如果你以前从未接触过web开发,并且想快速上线自己的个性化网站,Django绝对是你的最佳选择。 本教程为零基础的小白准备...
    99+
    2023-01-31
    前言 博客 Django
  • Django 博客开发教程 4 - 让
    我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。 迁移数据库 为了让 Django 完成翻译,创建好这些数据库表,我们再一...
    99+
    2023-01-31
    教程 博客 Django
  • 用Django框架快速搭建博客
    阅读文本大概需要 5 分钟。上次 2 篇文章给大家分享了 Django 搭建的基本知识,今天就把 Django 基本知识串起来,搭建一个简单的博客网站。项目环境语言:Python 3.6编辑器:Pycharm主要步骤创建项目创建 APP创建...
    99+
    2023-06-02
  • 2022年十大开源php博客系统有哪些?【推荐】
    博客,又译为网络日志、部落格或部落阁等,是一种通常由个人管理、不定期张贴新的文章的网站。那么怎么搭建博客?PHP博客系统有哪些?哪个博客系统好用?下面PHP中文网就来给大家总结分享十大开源php博客系统,一起来看看吧!一、WordPress...
    99+
    2022-08-08
    博客 php博客系统
  • MySQL系列之十二 备份与恢复
    目录系列教程一、备份策略赘述1、备份的类型2、备份需要考虑的因素3、备份的目标4、备份工具二、备份方案1、cp + tar == 物理冷备2、lvm快照 + binlog == 几乎...
    99+
    2024-04-02
  • Django博客系统注册之创建用户模块应用
    目录1. 创建用户模块应用2. 注册用户模块应用3. 准备模板目录并设置模板路径4. 定义用户注册视图5. 定义用户注册路由6.修改静态文件加载方式1. 创建用户模块应用 创建应用u...
    99+
    2024-04-02
  • 【Android从零单排系列二十二】《Android视图控件——GridView》
    目录 前言 一 GridView基本介绍 二 GridView使用方法 三 GridView常见属性及方法 四 总结 前言 小伙伴们,在上文中我们介绍了Android视图组件ExpandableListView,本文我们继续盘点,介绍一下...
    99+
    2023-09-01
    GridView AndroidGridview android 网格布局 Android excel android 矩阵
  • mysql系列(十二)——慢查询分析工具(mysqldumpslow)
    一、安装...
    99+
    2016-10-11
    mysql系列(十二)——慢查询分析工具(mysqldumpslow)
  • web.py 十分钟创建简易博客实现代码
    一、web.py简介 web.py是一款轻量级的Python web开发框架,简单、高效、学习成本低,特别适合作为python web开发的入门框架。官方站点:http://webpy.org/ 二、web...
    99+
    2022-06-04
    十分钟 简易 代码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作