首先回顾sql中聚合和分组的概念:

如果没有分组,会把整张表作为一个大组,查询字段必须是聚合结果;如果有分组,分组之后,必须要使用聚合的结果作为having的条件。

聚合查询

聚合:aggregate(*args, **kwargs)

规则:

1.可以同时对多个字段进行聚合处理;

2.是QuerySet对象方法;

3.方法返回值为字典类型

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

# 求书的平均价格
from django.db.models import Avg, Sum, Max, Min, Count
res = Book.objects.all().aggregate(Avg('price'))
print(res) {'price__avg': 56.29}
from django.db.models import Avg, Sum, Max, Min, Count
res = Book.objects.all().aggregate(avg_price=Avg('price')) # 给聚合结果字段起别名
print(res) {'avg_price': 56.29}

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

from django.db.models import Avg, Sum, Max, Min, Count
res = Book.objects.all().aggregate(Max('price'), Min('price'))
print(res) {'price__max': Decimal('88.88'), 'price__min': Decimal('33.33')}

分组查询

分组:annotate()

语法:values('分组字段').annotate(别名=聚合函数('字段')).filter(聚合字段别名条件).values('取分组字段','取聚合字段别名')

规则:

1.values(...).annotate(...)为分组组合,values控制分组字段,annotate控制聚合字段
2.values可按多个字段分组values('分组字段1', ..., '分组字段n'),??如果省略代表按操作表的主键分组
3.可以同时对多个字段进行聚合处理annotate(别名1=聚合函数1('字段1'), ..., 别名n=聚合函数n('字段n'))
4.分组后的的filter代表having判断,只对聚合字段进行条件判断,可以省略(对非聚合字段或分组字段进行条件判断代表where判断)
5.取字段值values(...)省略默认取所有分组字段与聚合字段,也可以自主取个别分组字段及聚合字段(取字段的values中出现了非分组或非聚合字段,该字段自动成为分组字段)

from django.db.models import Avg, Sum, Max, Min, Count
# 案例:每个出版社出版的最贵的书的价格高于50元的出版社名与最高价格
res = Book.objects.values('publish__name')\
.annotate(price=Max('price'))\
.filter(price__gt=50)\
.values('publish__name', 'price')
print(res)

方式二:

# res = Publish.objects.values('name')\
# .annotate(high_price=Max('book__price'))\
# .filter(high_price__gt=50)\
# .values('name', 'high_price')
# print(res)

常用共有字段属性

#1.null:默认为False,True表示字段可以为null
#2.blank:默认为False,True表示字段可以为空
#3.choices:可选的,限制了该选项的字段值必须是choice中的一个 # choices是元组套元组的形式
sex = models.SmallIntegerField(choices=((0, '女'),(1, '男')))
# 如果想获得key对应的value,可以通过obj.get_sex(字段名)_display()的方式进行获取 #4.db_column:自定义字段名
#5.db_index:如果值为True,则设置索引
#6.default:字段默认值
#7.editable:默认为True,若为False,则不会在/admin/界面显示
#8.primary_key:若设置为True,则表示将该字段设置为主键,一般情况下django默认会设置一个自增的id主键
#9.unique:若设置为True,该字段值不可重复

常用字段

#1. AutoField():默认自增主键(primary_key=True),django会默认建立id字段主键
#2. BooleanField():布尔字段,对应数据库tinyint类型
#3. CharField():字符类型
-- 字段属性max_length=64,数据长度,必须明确
#4. DateField():年月日时间类型
-- 字段属性auto_now=True,数据被更新就会更新时间
-- 字段属性auto_now_add=True,数据第一次参数时产生
#5. DateTimeField():年月日小时分钟秒时间类型
-- 字段属性auto_now=True,数据被更新就会更新时间
-- 字段属性auto_now_add=True,数据第一次参数时产生
#6. DecimalField():混合精度的小数类型
-- 字段属性max_digits=3,限定数字的最大位数(包含小数位)
-- 字段属性decimal_places=2,限制小数的最大位数
#7. IntegerField():整型

不常用字段

#1. BigAutoField():大整型自增
#2. BigIntegerField():长整型
#3. EmailField():邮箱字段,拥有/admin/验证
#4. FloatField():浮点型小数
#5. SmallIntegerField():小整型
#6. TextField():大文本类型
#7. FileField():文件字段

关系字段

#1.ForeignKey():外键字段
--字段属性to关联模型类
--字段属性to_field关联字段,省略默认关联主键
--字段属性on_delete(外键关联数据被删除时的操作),它的值有:
--models.CASCADE 级联删除
--models.PROTECT 抛出异常
--models.SET_NULL 设置空值
--models.SET_DEFAULT 设置默认值
--models.SET(value)自定义值
--字段属性related_name自定义反向查询的字段名
--字段属性db_constraint=False取消关联关系,但还可以使用连表查询,是否在数据库中创建外键约束,默认为True。
通常写法:models.ForeignKey(to='关联的类名',null=True,on_delete=models.SET_NULL,db_constraint=False,related_name='本类名小写')
注:
1.null=True保证在关联数据删除时,字段的值可以为空
2.on_delete=models.SET_NULL在关联数据删除时,将字段的值设置为空值
3.db_constraint=False取消关联关系,但还可以使用连表查询
#2.OneToOneField():一对一外键字段 -- 字段同外键 #3.ManyToManyField():多对多关系字段 -- 字段属性to关联模型类 -- 字段属性through关联关系表 -- 字段属性through_fields关联关系表中(本身类名小写字段, 关联表类名小写字段)

1.断开外键关联的ForeignKey使用

# 1、不使用ForeignKey方式断开关联,不再支持Django ORM连表查询语法
class Publish(models.Model):
name = models.CharField(max_length=20)
class Book(models.Model):
name = models.CharField(max_length=20)
# 字段需要写_id来表示相关表的字段信息
publish_id = models.IntegerField() # *****
# 2、使用ForeignKey方式用db_constraint=False字段属性断开关联,依然支持Django ORM连表查询语法,建议使用
class Publish(models.Model):
name = models.CharField(max_length=20)
class Book(models.Model):
name = models.CharField(max_length=20)
# 字段不需要写_id来表示相关表的字段信息,ORM会自动添加
publish = models.ForeignKey(to='Publish', null=True, on_delete=models.SET_NULL, db_constraint=False)

2.断开关联的多对多自动创建关系表

# *****
# 使用ManyToManyField方式用db_constraint=False字段属性断开关联,依然支持Django ORM连表查询语法,建议使用
class MyBook(models.Model):
name = models.CharField(max_length=20)
my_author = models.ManyToManyField(to='MyAuthor', db_constraint=False)
class MyAuthor(models.Model):
name = models.CharField(max_length=20)

3.断开关联的多对多手动创建关系表

# 手动创建关系表可以让关系表可以拥有更多的自身的字段,同时通过关系表类名可以直接获取第三张表
'''
# ****
# 1、和自动建立关系表类似,依然支持Django ORM连表查询语法(多对多借助关系表连表查询)
class Book(models.Model):
name = models.CharField(max_length=20) class Author(models.Model):
name = models.CharField(max_length=20) class Book_Author(models.Model):
book = models.ForeignKey(to="Book", null=True, on_delete=models.SET_NULL)
author = models.ForeignKey(to='Author', null=True, on_delete=models.SET_NULL)
time = models.DateField()
'''
2.
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名") # 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
# through_fields接受一个2元组('field1','field2'):
# 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。 class Author2Book(models.Model):
author = models.ForeignKey(to="Author",null=True, on_delete=models.SET_NULL,db_constraint=False)
book = models.ForeignKey(to="Book", null=True, on_delete=models.SET_NULL,db_constraint=False) class Meta:
unique_together = ("author", "book")

Django字段详解

Django聚合分组查询、常用字段的更多相关文章

  1. Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询

    一:聚合,分组查询 二:F, Q查询

  2. Django框架 之 ORM 常用字段和参数

    Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...

  3. django第10天(聚合查询,常用字段)

    django第10天 聚合查询 聚合函数的使用场景 单独使用:不分组,只查聚合结果 分组使用:按字段分组,可查分组字段与聚合结果 导入聚合函数 from django.db.models import ...

  4. day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁

    一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...

  5. Django 聚合分组F与Q查询及choices

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  6. day67 ORM模型之高阶用法整理,聚合,分组查询以及F和Q用法,附练习题整理

    归纳总结的笔记: day67 ORM 特殊的语法 一个简单的语法 --翻译成--> SQL语句 语法: 1. 操作数据库表 创建表.删除表.修改表 2. 操作数据库行 增.删.改.查 怎么连数据 ...

  7. Django学习——分组查询、图书管理系统项目、wsgi, uwsgi, cgi, fastcgi

    1 分组查询 # 分组查询 # 查询每一个出版社id,以及图书平均价格(单表) # 原生sql # select publish_id,avg(price) from app01_book group ...

  8. python3开发进阶-Django框架的ORM常用字段和参数

    阅读目录 常用字段 字段合集 自定义字段 字段参数 关系参数 多对多的关联关系的三种方式 一.常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中 ...

  9. Django框架之ORM常用字段

    一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过 ...

随机推荐

  1. java 11 值得关注的新特性

    JEP 181: Nest-Based Access Control 基于嵌套的访问控制 JEP 309: Dynamic Class-File Constants 动态类文件 JEP 315: Im ...

  2. CF24D Broken robot

    题目链接 题意 有一个\(n \times m\)的矩阵.机器人从点\((x,y)\)开始等概率的往下,往右,往左走或者不动.如果再第一列,那么不会往左走,再第m列不会往右走.也就是说机器人不会走出这 ...

  3. <二>企业级开源仓库nexus3实战应用–使用nexus3配置docker私有仓库

    1,安装nexus3. 这个地方略了,安装部署可以参考:nexus3安装配置. 2,配置走起. 1,创建blob存储. 登陆之后,先创建一个用于存储镜像的空间. 定义一个name,下边的内容会自动补全 ...

  4. Entity Framework入门教程(5)---EF中的持久化场景

    EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过 ...

  5. 使用Spring-Integration实现http消息转发

    目标:接收来自华为云的服务器报警信息,并转发到钉钉的自定义机器人中 使用Spring-Integration不仅节省了很多配置,还增加了可用性. 更多关于Spring-Integration的介绍可参 ...

  6. Beamer制作索引

    \documentclass{beamer} \usepackage{multicol} \usepackage{makeidx} \newenvironment{theindex}{% \let\i ...

  7. 查看和设置MySQL数据库字符集(转)

    查看和设置MySQL数据库字符集作者:scorpio 2008-01-21 10:05:17 标签: 杂谈 Liunx下修改MySQL字符集:1.查找MySQL的cnf文件的位置find / -ina ...

  8. ModuleNotFoundError: No module named '_sqlite3' -- python2.7 问题

    ModuleNotFoundError: No module named '_sqlite3' 运行python 工程出现上面这个问题,以为python安装中缺少这个依赖, 注python 2.7 首 ...

  9. 图文解说Win7系统机器上发布C#+ASP.NET网站

      1.     概述 在一台干净的Win7机器上发布ASP.NET网站需要准备的有: a)        .NET Framework 环境 b)        数据库 c)        IIS ...

  10. JVM--02

    Java虚拟机内存管理: 共享: 方法区:存储运行时常量池.已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据 java堆:存储对象实例 线程独占区: 虚拟机栈:存放方法运行时所需的 ...