1. 集合函数的使用场景:

  -- 单独使用: 不分组, 只查聚合结果

  -- 分组使用: 按字段分组, 可查询分组字段与聚合结果

2. 导入聚合函数

from django.db.models import Avg, Max, Min, Count, Sum

3. 单独聚合查询: aggregate

# 语法:
aggregate(别名=聚合函数('字段')) # 规则:
1.可以同时对多个字段进行聚合处理:aggregate(别名1=聚合函数1('字段1'), ..., 别名n=聚合函数n('字段n'))
3.是QuerySet对象方法
2.方法返回值返回值为dict类型 # 案例:所有书中最贵的书的价格
Book.objects.all().aggregate(high_price=Max('price'))
# 不分组单独使用的聚合函数 aggregate  把整个大表看成一个组
#high_price 这个是自定义的别名 方便后期调用

4. 分组聚合查询: 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中出现了非分组或非聚合字段,该字段自动成为分组字段) # 案例:每个出版社出版的最贵的书的价格高于50元的出版社名与最高价格
Book.objects.all().values('publish__name').annotate(high_price=Max('price')).filter(high_price__gt=50).values('publish__name', 'high_price')
# 案例:每个出版社出版的最贵的书的价格高于50元的出版社名与最高价格
res = Book.objects.values('publish__name')\
.annotate(high_price=Max('price'))\
.filter(high_price__gt=50)\
.values('publish__name', 'high_price')
print(res) #注意 'publish__name' 这个就是分组的字段
# 注意 high_price=Max('price') 就是自定义别名
# 注意 filter(high_price__gt=50) 就是分组后的过滤条件, 等于mysql中的having 函数
# 注意 values('publish__name', 'high_price') 最后取值 一定取分组字段与自定义别名 res = Publish.objects.values('name')\
.annotate(high_price=Max('book__price'))\
.filter(high_price__gt=50)\
.values('name', 'high_price')
print(res)

mysql表的创建常用字段属性解析

'''
1. null:默认为False,True表示字段可为null
2. blank:默认为False,True表示字段可为空
3. choice:可选的,限制了该选项的字段值必须是所指定的choice中的一个:
-- sex = models.SmallIntegerField(choices=((1, '男'), (2, "女")))
-- 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. ForeignKey():外键字段
-- 字段属性to关联模型类
-- 字段属性to_field关联字段,省略默认关联主键
-- 字段属性on_delete (外键关联数据被删除时的操作)
-- models.CASCADE 级联删除
-- modles.PROTECT 抛出异常
-- models.SET_NULL 设置空值
-- models.SET_DEFAULT 设置默认值
-- models.SET(value)自定义值
-- 字段属性related_name自定义反向查询的字段名
-- 字段属性db_constraint=False取消关联关系,但还可以使用连表查询
总结:models.ForeignKey(to='关联的类名', null=True, on_delete=models.SET_NULL, db_constraint=False, related_name="本类名小写") 2、OneToOneField():一对一外键字段
-- 字段同外键
3、ManyToManyField():多对多关系字段
-- 字段属性to关联模型类
-- 字段属性through关联关系类
-- 字段属性through_fields关联关系表中(本身类名小写字段, 关联表类名小写字段)
'''

关系字段-表与表关联的字段设置详解

# 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) '''

一对多关系Foreignkey用法

# *****
# 使用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)
'''

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

建表的案例:

from django.db import models

# Create your models here.

# Book书籍:id  name  price  publish_date  publish(publish_id)
class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
# 在2.x环境下外键要明确on_delete字段属性
publish = models.ForeignKey(to='Publish', to_field='id', on_delete=models.CASCADE)
author = models.ManyToManyField(to='Author') # 给你Book与Author # Author作者:id name
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
author_detail = models.OneToOneField(to='AuthorDetail', to_field='id', on_delete=models.CASCADE) # AuthorDetail作者详情: id age telephone info
class AuthorDetail(models.Model):
id = models.AutoField(primary_key=True)
age = models.IntegerField()
telephone = models.BigIntegerField()
info = models.TextField() # Publish出版社:id name address
class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
address = models.CharField(max_length=64) class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
age = models.IntegerField()
gender = models.SmallIntegerField()
province = models.CharField(max_length=20)
city = models.CharField(max_length=20) class Test1(models.Model):
a1 = models.CharField(max_length=20) # 插入数据时该字段必须赋值
a2 = models.CharField(max_length=20, null=True) # 插入数据时可以为空 # choices为元组套元组,子元组的第一个值类型要与字段类型对应,
# 第二个值可以代表第一个值得特殊含义
# 通过get_tagName_display()获取特殊含义
choices = ((0, '女'), (1, '男'))
sex = models.SmallIntegerField(choices=choices, default=0, db_column='gender') res = models.BooleanField(default=False) class Test2(models.Model):
name = models.CharField(max_length=20)
test1 = models.ForeignKey(to='Test1', null=True, on_delete=models.SET_NULL, db_constraint=False, related_name="tt")

建表的案例模板分析

基于orm的优化查询方案:

# only: 只取规定的字段形成对象(查主键)
# uq11 = Uesr.objects.all().only('name', 'age')
# print(uq11)
# print(uq11.query)
# print(uq11.first().name)
# print(uq11.first().gender) # 自己又重新执行了查询该字段的sql
#
# defer:只取规定的字段外的字段形成对象(查主键)
# uq12 = Uesr.objects.all().defer('name', 'age')
# print(uq12)
# print(uq12.query)
#
# 好处:只对所需字段进行查询
# 坏处:数据放在字典中,相比对象取值不是那么方便
# uq2 = Uesr.objects.values('name', 'age')
# print(uq2)
# print(uq2.query)

优化查询有only 与defer两种方案

Django之集合函数使用与mysql表的创建特殊字段分析的更多相关文章

  1. MySQL表的创建与维护

    一.导入测试数据 [root@server ~]# wget https://launchpadlibrarian.net/24493586/employees_db-full-1.0.6.tar.b ...

  2. MySQL表的创建和表中数据操作

    这篇文章主要介绍在navicat的命令界面操作mysql.主要涉及建立表结构,和对表中数据的增加删除修改查询等动作.站在一个新手角度的简单mysql表结构和数据操作. ☆ 准备工作 1,保证自己的电脑 ...

  3. mysql表的创建、查看、修改、删除

    一.创建表 创建表前先使用use 数据库名进入某一个数据库,创建表语句的格式如下: create table 表名称 ( 列名1 列的数据类型 [约束], 列名2 列的数据类型 [约束], 列名2 列 ...

  4. MySQL - 表中某个状态字段的状态表示区分最好用数字,如status - [9999:失败,1111:成功]

    表中某个状态字段的状态表示区分最好用数字,如status - [9999:失败,1111:成功]

  5. 在django中如何通过已有的mysql表生成django的model

    第一步:先是在项目中建立一个app:python manage.py startapp app01 第二步:python manage.py inspectdb > app01/models.p ...

  6. MySQL 表的创建、修改、删除

    1.创建表 create table 表名 ( 列名 类型 是否可以为空 列名 类型 是否可以为空 ) engine=innodb default charset=utf8; 是否可以为控制.null ...

  7. mysql表的创建和删除

    在创建数据库表时,最好是在编辑器中写好创建表的代码,然后粘贴到命令行中,这样如果有错修改起来方便. 现在来创建一个user表: -- 打开数据库, --后面必须要有空格, 表示注释 USE mydb3 ...

  8. MySQL表的创建

    第1步:设计 首先要设计一张用于我想要用途的表,例如如下用于描述个人的信息类型: 姓名: 性别: 出生日期: 地址: 最喜爱的食物. 下面为他来指定列和数据类型: 列 | 类型 | 允许值 | - | ...

  9. java读取mysql表的注释及字段注释

    /** * 读取mysql某数据库下表的注释信息 * * @author xxx */ public class MySQLTableComment { public static Connectio ...

随机推荐

  1. C++进阶--Koenig lookup 依赖于实参的名字查找

    //############################################################################ /* * Koenig Lookup / ...

  2. Web jsp开发学习——点击菜单页面切换

      两个网页使用同一个head,在点击“首页”后,head的“首页”变成绿色,点击“新闻”后,head的“新闻”变成绿色,head的“首页”恢复原来的颜色   head.jsp <%@ page ...

  3. 让SH/BAT脚本定位到运行目录的相对位置,实现其脚本可在任意运行目录下被正确执行

    让SH/BAT脚本定位到运行目录的相对位置 实现其脚本可在任意运行目录下被正确执行 在Linux下的bash脚本 #!/bin/bash cd `` 在Windows下的BAT脚本 echo off ...

  4. Socket传输简单的信息以及粘包问题的解决

    一.简单的socket程序——传输简短文字: # -*- coding: utf-8 -*- # -*- Author: WangHW -*- import socket whw_client = s ...

  5. typescript泛型接口

    //函数类型接口 /* interface ConfigFn{ (value1:string,value2:string):string; } var setData:ConfigFn=functio ...

  6. CVE-2017-12615漏洞利用

    Tomcat任意文件上传漏洞CVE-2017-12615复现 今天在群里听到有人讲这个CVE-2017-12615漏洞,想起自己的虚机ubuntu里面曾经装过tomcat,午休时间来瞅瞅. 漏洞利用条 ...

  7. Docker的常用命令

    docker命令有很多,总的分为以下几大类: 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause] 容器操作运维 — doc ...

  8. Win10还原被Windows Defender隔离的文件

    Win10最新版本的Windows Defender隔离/删除的文件没有还原的选项,导致很多破解文件或是注册机直接隔离,到威胁历史记录中去却无法恢复.经过各个尝试,到微软官方论坛中也尝试了很多方法,后 ...

  9. oracle比较一行的最大值或最小值

    1. COALESCE 返回该表达式列表的第一个非空value. 格式: COALESCE(value1, value2, value3, ...) 含义: 返回value列表第一个非空的值. val ...

  10. 零基础学习python_with(34课)

    今天学习的with语句,with的表达形式如下:据说context必须是上下文管理器,这我就懵比了,啥玩意啊... with语句的表达形式: with context as var:    block ...