【Django】聚合查询——连接和聚合

这篇具有很好参考价值的文章主要介绍了【Django】聚合查询——连接和聚合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

还是以下面的模型为例进行讨论,给出示例代码和示例结果

from django.db import models


class Author(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()


class Publisher(models.Model):
    name = models.CharField(max_length=300)


class Book(models.Model):
    name = models.CharField(max_length=300)
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    rating = models.FloatField()
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
    pubdate = models.DateField()


class Store(models.Model):
    name = models.CharField(max_length=300)
    books = models.ManyToManyField(Book)

正向查询

如果需要聚合查询某个模型相关联的其他模型的字段,我们要使用__(双下划线)
找出每家商店提供的书籍价格范围:

>>> from django.db.models import Max, Min
>>> Store.objects.annotate(min_price=Min("books__price"), max_price=Max("books__price"))
<QuerySet [<Store: Store object (1)>, <Store: Store object (2)>, <Store: Store object (3)>, <Store: Store object (4)>]>

这个规则也适用于aggregate(),找出所有商店在售书籍中的最低价格和最高价格:

>>> Store.objects.aggregate(min_price=Min("books__price"), max_price=Max("books__price"))
{'min_price': Decimal('5.00'), 'max_price': Decimal('30.00')}

还可以进行链式连接,找出在售书籍中最年轻作者的年龄:

>>> Store.objects.aggregate(youngest_age=Min("books__authors__age"))
{'youngest_age': 10}

反向查询

查询所有出版社,计算各自的书籍库存数量:

>>> from django.db.models import Avg, Count, Min, Sum
>>> Publisher.objects.annotate(Count("book"))
<QuerySet [<Publisher: Publisher object (1)>, <Publisher: Publisher object (2)>, <Publisher: Publisher object (3)>, <Publisher: Publisher object (4)>]>
>>> publishers = Publisher.objects.annotate(Count("book"))
>>> publishers[0].book__count
1

可以观察到查询结果里的每一个 Publisher 会有多余的属性—— book__count

要找到所有出版商管理的书籍中最老的一本书的出版日期:

>>> Publisher.objects.aggregate(oldest_pubdate=Min("book__pubdate"))
{'oldest_pubdate': datetime.date(2024, 3, 1)}

查询所有作者,并得到他所著书籍的总页数:

>>> Author.objects.annotate(total_pages=Sum("book__pages"))
<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>, <Author: Author object (3)>, <Author: Author object (4)>]>

要找到所有作者所著书籍的平均评分:文章来源地址https://www.toymoban.com/news/detail-838227.html

>>> Author.objects.aggregate(average_rating=Avg("book__rating"))
{'average_rating': 9.0}

到了这里,关于【Django】聚合查询——连接和聚合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django ORM 聚合查询和分组查询

    阅读文本前请参考此文章的数据表结构 对QuerySet计算统计值,需要使用 aggregate 方法,提供的参数可以是一个或多个聚合函数 Django提供了一系列的聚合函数,其中 Avg (平均值)、 Count (计数)、 Max (最大值)、 Min (最小值)、 Sum (加和)最为常用 要使用这些聚合函数,

    2024年02月01日
    浏览(50)
  • 数据库 SQL高级查询语句:聚合查询,多表查询,连接查询

    创建Students和Courses表 直接查询 设置别名查询 设置条件查询 使用COUNT(*) 和 COUNT(StudentID)是一样的效果,因为StudentID是主键,每行记录的主键都不同。另外我们在聚合查询中还是能使用WHERE子句的,比如我们要 查找年龄大于20岁的学生数量 ,可使用以下SQL语句: 函数 说明 SUM

    2024年02月09日
    浏览(99)
  • Django连接数据库

    mysql -u root -p show databases; 在settings.py文件中进行配置和修改 在models.py文件中进行修改 创建表 执行命令: python manage.py makemigrations python manage.py migrate 条件:在setings保证app已经注册 删除表 当需要删除表时,则再models.py中注释表结构,然后重新执行命令即可。 修改表 新增列的

    2024年04月27日
    浏览(22)
  • Django连接多个数据库

    为了让不同业务的数据分离,落到不同的库,使用 django 连接多个数据库。 Django 使用 default 数据库,如果没有其他选择 default 可以没有,但是必须设置一个空字典 设置多个数据库,需要同步多次。这里比较麻烦。 迁移将会把所有model的所有表镜像的迁移到两个库,自带的指

    2024年02月11日
    浏览(37)
  • Django的mysql数据库连接

    首先Mysql和navicate Premuim 已经安装好,并且可以建立数据库的连接,本次需使用的工具是 1、vs code 2、navicate Premuim 3、Mysql 打开vs code ,按Ctrl+ Shift + ~ ,调出vs code的终端界面,输入以下命令创建 test11 项目  django-admin startproject test11 (1)创建虚拟环境命令: 需要跳转到项目test1

    2024年02月05日
    浏览(52)
  • Django笔记二十八之数据库查询优化汇总

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十八之数据库查询优化汇总 这一篇笔记将从以下几个方面来介绍 Django 在查询过程中的一些优化操作,有一些是介绍如何获取 Django 查询转化的 sql 语句,有一些是理解 QuerySet 是如何获取数据的。 以下是本篇笔记目录: 性

    2023年04月22日
    浏览(59)
  • 问题解决:django模型查询报错,找不到数据库表

    django项目,使用的postgresql数据库,建了多个模式,模型查询时一直默认查public的表 1. 问题 :   django.db.utils.ProgrammingError: relation \\\"ip_management_app.table\\\" does not exist 2. 代码: 3. 解决方案 (1)使用的django2.0,settings文件中修改数据库配置,增加OPTIONS (2)其他方案 修改db_table,有

    2024年01月23日
    浏览(40)
  • 【python】Django——连接mysql数据库

    笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 ORM(Object-Relational Mapping)是一种编程技术,它允许开发者使用面

    2024年02月04日
    浏览(44)
  • Django笔记二十一之使用原生SQL查询数据库

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十一之使用原生SQL查询数据库 Django 提供了两种方式来执行原生 SQL 代码。 一种是使用 raw() 函数,一种是 使用 connection.cursor()。 但是官方还是推荐在使用原生 SQL 之前,尽量的先去探索一下 QuerySet 提供的各种 API。 目前而言

    2023年04月10日
    浏览(41)
  • Python Django 之连接 Mysql 数据库详解

    博客:https://blog.csdn.net/qq_34745941/article/details/122549376 若已安装,请忽略。 主要使用的文件如图 若 pip 安装失败,可进入 Python 官方库中下载 whl 文件,操作可参考: 博客:https://blog.csdn.net/qq_34745941/article/details/106341898 在 settings.py 中,配置 Mysql 的连接串 扩展: Django 也支持其

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包