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

一、聚合查询


需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg

关键语法:aggregate(聚合结果别名 = 聚合函数(参数))

查询结果:使用聚合函数,从每一个组中获取结果:字典

注意点:

1 聚合函数必须在分组之后才能使用

2 没有分组,即默认整体就是一组

3 查询结果为 普通字典

"""
    聚合查询通常情况下都是配合分组一起使用的
    只要是跟数据库相关的模块 
      基本上都在 django.db.models 里面
      上述没有那么应该在 django.db里面
"""
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)

 

二、分组查询


1 关键字:annotate

2 默认以当前表 id 分组,并使用聚合函数在组内进行聚合计算,得到结果作为查询结果中组内的属性

from django.db.models import Max, Min, Sum, Count, Avg
# 1 统计每一本书的作者个数
res = models.Book.objects.annotate()  # models后面点什么 就是按什么分组
res1 = models.Book.objects.annotate(author_num = Count('authors')).values('title', 'author_num')
res2 = models.Book.objects.annotate(author_num = Count('authors__nid')).values('title', 'author_num')
print(res, res1, res3)
"""
author_num 自己定义的字段 用来存储统计出来的每本书对应的作者个数
"""

# 2 统计每个出版社卖的最便宜的书的价格
res = models.Publish.objects.annotate(min_price = Min('book__price')).values('name', 'min_price')
print(res)

# 3 统计不止一个作者的图书
#     先按照图书分组 求每一本书对应的作者个数
#     过滤出不止一个作者的图书
res = models.Book.objects.annotate(author_num = Count('authors')).filter(author_num__gt = 1).values('title', 'author_num')
print(res)

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

# 5 统计 price大于150元 的书籍的作者个数
res = models.Book.objects.filter(price__gt = 150).annotate(num_authors = Count('authors')).values('title', 'num_authors')
print(res)

 

 

三、F与Q查询


 

# F查询
"""
能够帮助你直接获取到表中某个字段对应的数据
"""
from django.db.models import F

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


# 2 将 django 书的名称后面加上 ' web' 字
"""
在操作字符类型的数据的时候 F不能够直接做到字符串的拼接
"""
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.filter(title = "django").update(title = Concat(F('title'), Value(' web')))

 

# Q查询
"""
filter括号内多个参数是and关系
"""
from django.db.models import Q

# Q包裹逗号分割 还是and关系
res1 = models.Book.objects.filter(Q(price__lt = 300), Q(price__gt = 400))  
print(res1)

# | or关系
res2 = models.Book.objects.filter(Q(pub_date__lt = '2020-01-01') | Q(price__gt = 300)) 
print(res2)

# ~ not关系
res3 = models.Book.objects.filter( ~ Q(pub_date__lt = '2020-01-01') | Q(price__lt = 200)) 
print(res3)  # <QuerySet []>

# Q的高阶用法  能够将查询条件的左边也变成字符串的形式
# 提前生成 Q 对象,并使用 append方法 添加条件
q = Q()
q.connector = 'or'
q.children.append(('pub_date__lt', '2020-01-01'))
q.children.append(('price__lt', 200))
res = models.Book.objects.filter(q)  # 默认是and关系
print(res)

 

四、特殊参数choices


1 定义字段时,指定参数 choices

2 choices 的值为元组套元组(事先定义好,一般在该表类中定义该字段之前定义)

3 每一个元组存放两个元素,形成一种对应关系

4 往数据库中存值时,该字段的值存为元组第一个元素即可

5 通过 对象.get_字段名_display() 获取对应的元组第二个元素值,当没有对应关系时,返回的是它本身

示例:

# 定义一个 UserTest 表
class UserTest(models.Model):
    name = models.CharField(max_length = 64)
    gender_choices = ((1, '男'),(2, '女'),(3, '其他'))
    gender = models.IntegerField(choices = gender_choices)
    
# 同步迁移到数据库
python manage.py makemigrations
python manage.py migrate

# 在 test.py 配置测试环境
# 录入数据
models.UserTest.objects.create(name = '小微', gender = 1)
models.UserTest.objects.create(name = '小芬', gender = 2)
models.UserTest.objects.create(name = '小桃', gender = 3)
models.UserTest.objects.create(name = '小月', gender = 4)

# 验证choices
for user_obj in models.UserTest.objects.all():
    print(user_obj.gender, end=' ')
    print(user_obj.get_gender_display())
'''
1 男
2 女
3 其他
4 4
'''

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 聚合分组F与Q查询及choices - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Django 之ModelAdmin对象(补)

    一、后台管理系统配置 1 在该表对应的models类里面添加一个Meta类 class Meta: verbose_name_plural = ‘用户表’ ### 指定该表在admin后台的名字为: 用户表 # verbose_name = ‘用户表’ ### 末尾还是会自动加s   2 null=True,blank=True的区别 ### null=Tr…

    2023年4月2日
    00
  • Django 使用VScode 创建工程

    一、VSCode 创建Django 工程 1 地址 https://code.visualstudio.com 2 mysite(项目名),创建Django 项目,可以和虚拟环境放在同一目录,也可以放在虚拟环境的文件夹里。 django-admin startproject mysite 3 新建文件夹–>搭建虚拟环境,新建一个项目文件夹 mysit…

    2023年4月2日
    00
  • Django 之Auth模块

    一、Auth 模块是什么 Auth 模块是Django中自带的用户认证模块。 一个网站系统需要实现用户注册、用户登录、用户认证、注销、修改密码等功能,Django中内置了强大的认证系统-auth,默认使用 auth_user 表来存储用户的数据。 同时Django有一个后台管理系统(127.0.0.1:8000/admin),使用的用户名和密码也是这张数据表…

    2023年4月2日
    00
  • Django ORM 实现数据的多表 增删改查

    一、创建模型和表 假定下面这些概念、字段与关系: 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,手机号,家庭住址信息。 作者详情模型 和 作者模型之间是一对一的关系(one-to-one)。 出版社模型:出版社有名称,所在城市以及email。 书籍模型: 书籍有书名和价格、出版日期。 一本书可能会有多个作者,一个作者也可以写多本书,…

    Python开发 2023年4月2日
    00
  • Django 之路由层

    一、Django 请求周期生命流程图 首先,用户在浏览器中输入URL,发送一个GET 或 POST 方法的request 请求。 Django 中封装了socket 的WSGI 服务器,监听端口接受这个request 请求。 再进行初步封装,然后传送到中间件中,这个request 请求再依次经过中间件。 对请求进行校验或处理,再传输到路由系统中进行路由分发,…

    2023年4月2日
    00
  • Django django-admin.py 命令详解

    一、Django 基本命令 下载 Django pip3 install django     # 默认下载最新版 pip3 install django==4.1  # 手动选择版本   创建Django 项目 格式:django-admin startproject 项目名 django-admin startproject mysite   创建APP…

    2023年4月2日
    00
  • Sublime Text 配置

    介绍 Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等,还可自定义键绑定,菜单和工具栏。 Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。 Sublime Text 是一个跨平台的编辑器,同时支持 Windows…

    2023年4月2日
    00
  • Django 之中间件

    Django 之中间件

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部