zoukankan      html  css  js  c++  java
  • django基础之ORM之聚合函数及其他操作

    聚合查询与分组查询

    在首先需要知道在数据库中聚合查询与分组查询是怎么查的

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

    例如:计算所有图书的平均价格:

    #计算所有书籍的平均价格
    from django.db.models import Avg
    models.Book.objects.all().aggregate(Avg('price'))
    结果格式如:{'price__avg':34.5}

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

    例:models.Book.objects.all().aggregate_price(Avg('price'))

    结果:{'average_price': 34.35}

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

    例:from django.db.models import Avg,Max,Min
      models.Book.objects.aggregate(Avg('price'),Max('price'),Min('price'))
    结果:{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

    分组:annotate()

    调用的queryset中的每一个对象都生成一个独立的统计值(统计方法用聚合函数)。

    例如:

    bookList=models.Book.objects.annotate(authorsNum=Couont('authors'))
    for book_obj in bookList:
            print(book_obj.title,book.authorsNum)

    以上表达的意思在sql语句中怎样写呢:

    SELECT 
    "app01_book"."nid", 
    "app01_book"."title", 
    "app01_book"."publishDate", 
    "app01_book"."price", 
    "app01_book"."pageNum", 
    "app01_book"."publish_id", 
    COUNT("app01_book_authors"."author_id") AS "authorsNum" 
    FROM "app01_book" LEFT OUTER JOIN "app01_book_authors" 
    ON ("app01_book"."nid" = "app01_book_authors"."book_id") 
    GROUP BY 
    "app01_book"."nid", 
    "app01_book"."title", 
    "app01_book"."publishDate", 
    "app01_book"."price", 
    "app01_book"."pageNum", 
    "app01_book"."publish_id"
    sql分组查询语句

    如果想对所有查询对象的关联对象进行聚合:

    例:统计每一个出版社的最便宜的书

    publishList=models.Publish.objects.annotate(MinPrice=Min('book__price'))
    for publish_obj in publishList:
            print(publish_obj.name,publish_obj.MinPrice)

    如若不用for循环遍历可以用valuelist:
    queryResult= Publish.objects
                .annotate(MinPrice=Min("book__price"))
                .values_list("name","MinPrice")
    print(queryResult)  

    另外一种方式:

    queryResult=models.Book.objects.values("publish__name").annotate(MinPrice=Min('price'))
    如果用这种方法,有一个出版社没有出版过书会怎么样呢?

    解答:查看Book.objects.values("publish__name")的结果和对应的sql语句可以理解为values内的字段也就是group by的字段

    F查询和Q查询

    F查询:

    Q查询:

    修改表记录

    删除表记录

    持续更新.....

  • 相关阅读:
    为什么 PHP 程序员应该学习使用 Swoole
    如何优雅的使用和理解线程池
    Redis 数据结构-字符串源码分析
    MySQL多版本并发控制机制(MVCC)-源码浅析
    Spring事务用法示例与实现原理
    J2Cache 和普通缓存框架有何不同,它解决了什么问题?
    Spring Aop之Cglib实现原理详解
    Python中字符串拼接的N种方法
    使用Fiddler抓取到的“姐夫酷”API接口
    [Android]Space控件的应用场景
  • 原文地址:https://www.cnblogs.com/kxllong/p/8361918.html
Copyright © 2011-2022 走看看