示例代碼以下:python
'''python #模型要放在app當中。因此首先要在終端命令行窗口,執行命令: python manage.py startapp front
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'orm_aggregate_demo', 'USER': 'root', 'PASSWORD': 'root', 'HOST': '127.0.0.1', 'PORT': '3306', } }
from django.db import models # 定義做者的模型 class Author(models.Model): <!-- 指定unique=True,規定字段的惟一性 --> name = models.CharField(max_length=30, unique=True) age = models.IntegerField() email = models.EmailField() class Meta: db_table = 'author' # 定義出版社模型 class Publisher(models.Model): <!-- 指定unique=True,規定字段的惟一性 --> name = models.CharField(max_length=100, unique=True) class Meta: db_table = 'publisher' # 定義一個圖書模型 class Book(models.Model): <!-- 指定unique=True,規定字段的惟一性 --> name = models.CharField(max_length=100, unique=True) pages = models.IntegerField() price = models.FloatField() rating = models.FloatField() author = models.ForeignKey('Author', on_delete=models.CASCADE) publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE) class Meta: db_table = 'book' # 定義一個預約書的模型 class BookOrder(models.Model): book = models.ForeignKey('Book', on_delete=models.CASCADE) price = models.FloatField() class Meta: db_table = 'book_order' 終端命令行窗口,執行命令:python manage.py makemigrations(生成相應的遷移腳本)和python manage.py migrate(將生成的遷移腳本映射到數據庫中。)
from .models import Book from django.db.models import Avg from django.http import HttpResponse
# views.py文件中: def index(request): # 聚合函數要放在aggregate()方法中,還有其餘的可以執行聚合函數的方法,以後會進行講解 result = Book.objects.aggregate(Avg('price')) print(result)
此時打印出的輸出結果就是:
{"price__avg": 價格}
「price__avg」是根據field__avg規則構成的,若是想要修改默認的名字,那麼能夠將Avg賦值給一個關鍵字參數。
示例代碼以下:mysql
from django.db.models import Avg result = Book.objects.aggregate(my_avg=Avg('price')) print(result)
此時打印出的輸出結果就是:
{"my_avg": 價格}sql
同時咱們能夠打印出查詢的原生SQL語句數據庫
from django.db import connection def inex(request): result = Book.objects.aggregate(Avg('price')) print(connection.queries) # queries中存儲了不少的SQL語句。 # 不可以經過print(result.query),進行打印SQL語句。 # 由於result爲dict類型,沒有query屬性。 print(type(result))
result = Book.objects.aggregate(avg=Avg("price"))
from django.db import connection from .models import Book from django.http import HttpResponse from django.db.models import Avg def index(request): result = Book.objects.aggregate(Avg('price')) print(connection.queries) return HttpResponse("success!")
result = Book.objects.aggregate(book_num=Count('id'))
此時就會返回Book表中圖書的數量.django
from django.shortcuts import render from django.http import HttpResponse from .models import Author,Publisher,Book,BookOrder from django.db.models import Avg,Count,Sum from django.db import connection def index(request): # 計算同一種書的預約平均價格,使用annotate()方法執行聚合函數,能夠進行分組(group by) # 由父類和子類的模型關係咱們知道,子類經過外鍵的關係了父類,那麼django就會在底層爲父類添加一個名爲子類名字小寫形式的方法。 books = Book.objects.annotate(avg=Avg("bookorder__price")) # print(books) # 打印出結果:<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>]> # 結果顯示的是QuerySet類型,能夠經過遍歷獲得具體的圖書相關信息 for book in books: print("%s,%s,平均價格:%s" % (book.name,book.author,book.avg)) # 打印出結果: # 三國演義,羅貫中,47,312587329@qq.com,平均價格:101.5 # 水滸傳,施耐庵,57,1924572@qq.com,平均價格:107.5 # 紅樓夢,曹雪芹,42,123521472@qq.com,平均價格:102.0 # 西遊記,吳承恩,34,193452272@qq.com,平均價格:None print(connection.queries) # 打印出結果:[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, AVG(`book_order`.`price`) AS `avg` FROM `book` LEFT OUTER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) GROUP BY `book`.`id` ORDER BY NULL LIMIT 21', 'time': '0.000'}] return HttpResponse("success !")