Python模型聚合查询\Q查询\F查询\分组查询操作技巧解析

目录
  • 模型中的一些查询操作:
    • 1.聚合查询:aggregate()是QuerySet 的一个终止子句
    • 2.Q查询: 如果你需要执行更复杂的查询(例如OR语句)
    • 3.F查询: (查询的是一整列数据!)
    • 4.分组查询
      • 4.1一对多关系
      • 4.2多对多关系

模型中的一些查询操作:

1.聚合查询:aggregate()是QuerySet 的一个终止子句

它返回一个包含一些键值对的字典

from movie.models import User
from django.db.models import Count, Avg, Max, Min, Sum
def test_info(request):
    #聚合查询
    #求User中的平均年龄			默认返回的数据格式是一个字典,其中键名为age__avg,值为指定字段的平均值。
    rs = User.objects.all().aggregate(Avg("age"))
    #指定一个名字			    可以通过如下指定字典的键名。
    rs = User.objects.all().aggregate(age=Avg("age"))
    #平均,最大,最小,求和
    rs = User.objects.all().aggregate(Avg("age"),Max("age"),Min("age"),Sum("age"))

默认情况下(求User中的平均年龄):

指定键名(求User中的平均年龄):

2.Q查询: 如果你需要执行更复杂的查询(例如OR语句)

你可以使用Q对象。Q对象可以使用&(and)、|(or)操作符;使用~(not)操作符在Q对象前表示取反

# 查询出User表中name为小明或者小红的
rs = User.objects.filter(Q(name='小明')|Q(name='小红'))
# 查询Student表中,name为小明,年龄不等于18的
rs = User.objects.filter(Q(name='小明')&~Q(age=18))

3.F查询: (查询的是一整列数据!)

针对两个字段的值的比较

# 学院id小于学生的学号的
rs = Student.objects.filter(department_id__gt=F('s_id))
# 给User表中的所有人加1岁
rs = User.objects.all().update(age=F('age')+1)

4.分组查询

为调用的QuerySet中每一个对象都生成一个独立的统计值

4.1一对多关系

import Student,Course
from django.db.models import Count

# 拿出学生表中需要分组的字段
rs = Student.objects.values()     # 以字典形式展示所有查询到的数据的全部信息
"""
输出示例:
<QuerySet[{'s_id':1, 's_name': '小明', 'department_id':1},{'s_id':2, 's_name': '小红', 'department_id':2},
{'s_id':3, 's_name': '小王', department_id':1}]>
"""
rs = Student.objects.values('department')  # 以字典形式展示所有查询到的数据的department字段
"""
输出示例:
<QuerySet[{'department':1},{'department':2},{'department':1}]>
"""
rs = Student.objects.values('s_name','department')  # 以字典形式展示所有查询到的数据的s_name和department字段
"""
输出示例:
<QuerySet[{'s_name': '小明', 'department':1},{'s_name': '小红', 'department':2},{'s_name': '小王', 'department':1}]>
"""
# 对这个department字段进行分组
rs = Student.objects.values('department').annotate(count=Count('department'))
"""
输出示例:
<QuerySet[{'department':1, 'count': 2},{'department':2, 'count': 1}]>
"""
# 对分组后的内容按需要的字段输出
rs = Student.objects.values('department').annotate(count=Count('department')).values('department', 'count')
"""
输出示例:
<QuerySet[{'department':1, 'count': 2},{'department':2, 'count': 1}]>
"""

4.2多对多关系

# 多对多关系
# 以课程作为分组条件查每个课程的学生数量     拿到所有的课程的数据
rs = Course.objects.all()
# 关系表中,同一个课程,学生学号出现的次数,就是报名了此课程的学生的个数
rs = Course.objects.all().annotate(count=Count('students'))
rs = Course.objects.all().annotate(count=Count('students')).values('c_name', 'count')
# 以学生作为分组条件来查每个学生报名了的课程数量    拿到所有的学生的数据
rs = Student.objects.all()
# 关系表中,同一个学生,课程出现的次数,就是这个学生报名的课程的数量
rs = Student.objects.all().annotate(count=Count('course'))
rs = Student.objects.all().annotate(count=Count('course')).value('s_name', 'count')

以上就是模型聚合查询\Q查询\F查询\分组查询操作技巧解析的详细内容,更多关于模型查询操作的资料请关注我们其它相关文章!

(0)

相关推荐

  • Django ORM 聚合查询和分组查询实现详解

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64, null=False, unique=True) def __str__(self): return "<Publisher object: {}>".format(

  • django框架F&Q 聚合与分组操作示例

    本文实例讲述了django框架F&Q 聚合与分组操作.分享给大家供大家参考,具体如下: F 使用查询条件的值,专门取对象中某列值的操作,可以对同一个表中的两个列进行比较 from django.db.models import F ret=models.Book.objects.filter(count__lt=F('sale')).values() #查找 列 count < sale的数据 for i in ret: print(i) models.Book.objects.filter

  • django 中的聚合函数,分组函数,F 查询,Q查询

    先以mysql的语句,聚合用在分组里, 对mysql中groupby 是分组 每什么的时候就要分组,如 每个小组,就按小组分, group by 字段 having 聚合函数 #举例 :求班里的平均成绩, select Avg(score) from stu 在django中 聚合 是aggreate(*args,**kwargs),通过QuerySet 进行计算.做求值运算的时候使用 分组 是annotate(*args,**kwargs),括号里是条件,遇到 每什么的时候就要分组, 先从mo

  • django中F与Q查询的使用

    目录 F查询 Q查询 事务 其他鲜为人知的操作 Django ORM执行原生SQL QuerySet方法大全 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值. 示例1: 查询出卖出数大于库存数的商品 from django.db.models import F ret1=mode

  • Python模型聚合查询\Q查询\F查询\分组查询操作技巧解析

    目录 模型中的一些查询操作: 1.聚合查询:aggregate()是QuerySet 的一个终止子句 2.Q查询: 如果你需要执行更复杂的查询(例如OR语句) 3.F查询: (查询的是一整列数据!) 4.分组查询 4.1一对多关系 4.2多对多关系 模型中的一些查询操作: 1.聚合查询:aggregate()是QuerySet 的一个终止子句 它返回一个包含一些键值对的字典 from movie.models import User from django.db.models import Co

  • mysql按照时间分组查询的语句

    mysql 按年.月.周.日分组查询 1.按照年份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y') month_time,sum(t.pay_price) total FROM f_bill t GROUP BY month_time; 查询结果 2.按照月份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y-%m') month_time,sum(t.pay_price) total FROM f_bill t GROUP BY m

  • django 利用Q对象与F对象进行查询的实现

    Q对象: 优势:可以实现 与|或|非 组合查询. 给几个小例子就一目了然了: Book.objects.filter(id__gt=2,bread__gt=20) #and关系 Book.objects.filter(Q(bread__gt=20) & Q(id__gt=2)) #and关系 Book.objects.filter(Q(bread__gt=20) | Q(id__gt=2)) #or关系 Book.objects.filter.(~Q(id=3)) # ~表示not,查询编号不等

  • Django中Q查询及Q()对象 F查询及F()对象用法

    Django Q/F #1 环境 Python3.7.3 Django==2.0.6 #2 开始 #2.1 django F()表达式 每次获取times当前的值,再+1,这样需要将times值取出,存到内存中 obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save() 虽然 obj.times = F("times") + 1 看起来像常规的Python为实例属性赋值

  • 易语言实现快捷登录查询Q币消费记录的代码

    常量数据表 .版本 2 .常量 常量1, "<文本长度: 139>", , "accttype": "(.*?)"[\s\S]*?"balance": "(.*?)"[\s\S]*?"info": "(.*?)"[\s\S]*?"pay": "(.*?)"[\s\S]*?"save": "

  • Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()

    Laravel 5.5 Linux mint 18 PHPStorm 最近刚玩Laravel,手册源码还没来得及看完就跃跃欲试做了个小项目,其中有个需求是分组查询数据库中的一个字段并返回每个分组中的数量,还是去翻手册(手册确实够简单): groupBy 和 having 方法可用来对查询结果进行分组.having 方法的用法和 where 方法类似: $users = DB::table('users') ->groupBy('account_id') ->having('account_id

  • thinkphp 3.2框架视图模型 实例视图查询结果的二维数组合并操作示例

    本文实例讲述了thinkphp 3.2框架视图模型 实例视图查询结果的二维数组合并操作.分享给大家供大家参考,具体如下: 使用视图模型查询的时候 结果是这样的 array(6) { [0] => array(5) { ["picTitle"] => string(7) "标题2" ["picCategroy"] => string(6) "海报" ["picAuthor"] => s

  • MySQL 分组查询和聚合函数

    概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位):或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估). 这个时候就要用到分组查询,分组查询的目的是为了把数据分成多个逻辑组(购买化妆品的人员是一个组,不同年龄段购买化妆品的人员也是组),并对每个组进行聚合计算的过程:. 分组查询的语法格式如下: select cname, group_fun,... from tname [where conditio

  • MySQL必备基础之分组函数 聚合函数 分组查询详解

    目录 一.简单使用 二.搭配DISTINCT去重 三.COUNT()详细介绍 四.分组查询 一.简单使用 SUM:求和(一般用于处理数值型) AVG:平均(一般用于处理数值型) MAX:最大(也可以用于处理字符串和日期) MIN:最小(也可以用于处理字符串和日期) COUNT:数量(统计非空值的数据个数) 以上分组函数都忽略空NULL值的数据 SELECT SUM(salary) AS 和,AVG(salary) AS 平均,MAX(salary) AS 最大,MIN(salary) AS 最小

  • Python数据分析之 Pandas Dataframe修改和删除及查询操作

    目录 一.查询操作 元素的查询 二.修改操作 行列索引的修改 元素值的修改 三.行和列的删除操作 一.查询操作 可以使用Dataframe的index属性和columns属性获取行.列索引. import pandas as pd data = {"name": ["Alice", "Bob", "Cindy", "David"], "age": [25, 23, 28, 24], &q

随机推荐