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查询:

    修改表记录

    删除表记录

    持续更新.....

  • 相关阅读:
    解决 JDK1.7 不支持 VCenter 6.7 的问题(涉及到Https TLS1.2协议)
    无法删除另一个分区的windows文件夹
    首次将项目从eclipse提交到服务器的SVN
    无法截图右键菜单
    配置文件无法修改(以修改my-default.ini为例)
    运行JavaWeb项目报错Access denied for user 'root'@'localhost' (using password: YES)
    jquery.page.js插件在使用时重复触发“上一页”和“下一页”操作
    请求ajax失败的原因(进入到error)
    ajax请求执行完成后再执行其他操作(jQuery.page.js插件使用为例)
    img标签src资源无法加载,报net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION错
  • 原文地址:https://www.cnblogs.com/kxllong/p/8361918.html
Copyright © 2011-2022 走看看