django2.0 ORM聚合函数的使用:Count(求数量)与 `Max`和`Min`,Sum求和


发布时间:2019-02-15 13:08    作者: Uncle Hui   已过去:1 年,7 月   阅读总量:210 已被赞:0


`Count`:用来求某个数据的个数。比如要求所有图书的数量,那么可以使用以下代码:
    ```python
    result = Book.objects.aggregate(book_nums=Count("id"))
    ```

实例:

# 要统计作者表中总共有多少个不同的邮箱
 result = Author.objects.aggregate(email_nums=Count('email',distinct=True)) 
distinct=True,使用这个参数后,清楚重复
    并且`Count`可以传递`distinct=True`参数,用来剔除那些重复的值,只保留一个。
    如要获取作者表中,不同邮箱的个数,那么这时候可以使用`distinct=True`。示例代码如下:
    ```python
    result = Author.objects.aggregate(email_nums=Count('email',distinct=True))
    ```

分组求出没种书的销量:

books = Book.objects.annotate(book_nums=Count("bookorder__id")) #如果是通过主键查找,可以省略主键写出这样
books = Book.objects.annotate(book_nums=Count("bookorder")) 
for book in books:
    print('%s/%s' % (book.name,book.book_nums))

7. `Max`和`Min`:求指定字段的最大值和最小值。示例代码如下:
    ```python
    result = Author.objects.aggregate(max=Max("age"),min=Min("age")) #括号里可以使用多个聚合函数
    ```

分组使用实例:

# 获取每一种图书售卖时候的最大价格以及最小价格
books = Book.objects.annotate(max=Max("bookorder__price"),min=Min("bookorder__price"))
for book in books:
    print('%s/%s/%s'%(book.name,book.max,book.min))

8. `Sum`:求某个字段值的总和。示例代码如下:
    ```python
    result = BookOrder.objects.aggregate(total=Sum('price'))
    ```
    `aggregate`和`annotate`方法可以在任何的`QuerySet`对象上调用。因此只要是返回了`QuerySet`对象,
    那么就可以进行链式调用。比如要获取2018年度的销售总额,那么可以先过滤年份,再求聚合函数。示例代码如下:
    ```python
    BookOrder.objects.filter(create_time__year=2018).aggregate(total=Sum('price'))
    ```

实例:

# 1. 求所有图书的销售总额
# result = BookOrder.objects.aggregate(total=Sum('price'))
# print(result)
# print(connection.queries)



# 2. 每一种图书的销售总额
# books = Book.objects.annotate(total=Sum("bookorder__price"))
# for book in books:
#     print("%s/%s"%(book.name,book.total))
# print(connection.queries)



# 3. 先求全部图书在2018年度,销售总额
# result = BookOrder.objects.filter(create_time__year=2018).aggregate(total=Sum('price'))
# print(result)
# print(connection.queries)



# 4. 求每一种图书在2018年度的销售总额
books = Book.objects.filter(bookorder__create_time__year=2018).annotate(total=Sum("bookorder__price"))
for book in books:
    print("%s/%s"%(book.name,book.total))

 

点赞

0




登陆后方可评论