`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
登陆后方可评论