您好,登錄后才能下訂單哦!
models.py:
from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64, null=False, unique=True) def __str__(self): return "<Publisher object: {}>".format(self.name) # 書籍 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=64, null=False, unique=True) price = models.DecimalField(max_digits=5, decimal_places=2, default=00.00) # 最長位數為 5,小數位數為 2,默認值為 00.00 publisher = models.ForeignKey(to="Publisher", null=True) # 把 null 設置為 True def __str__(self): return "<Book object: {}>".format(self.title) # 作者 class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16, null=False, unique=True) book = models.ManyToManyField(to="Book") # 多對多關聯 Book 表,ORM 會自動生成第 3 張表 def __str__(self): return "<Author object: {}>".format(self.name)
book 表:
修改 price
聚合查詢:
aggregate():返回一個包含一些鍵值對的字典。
鍵的名稱是聚合值的標識符,值是計算出來的聚合值。鍵的名稱是按照字段和聚合函數的名稱自動生成出來的。
orm.py:
import os if __name__ == '__main__': # 加載 Django 項目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導入 Django,并啟動 Django 項目 import django django.setup() from app01 import models # 聚合查詢需要導入的函數 from django.db.models import Avg, Sum, Max, Min, Count # 計算所有書籍 price 的平均值 avg_ret = models.Book.objects.all().aggregate(Avg("price")) print(avg_ret) # 計算所有書籍 price 的總和 sum_ret = models.Book.objects.all().aggregate(Sum("price")) print(sum_ret) # 計算所有書籍 price 的最大值 max_ret = models.Book.objects.all().aggregate(Max("price")) print(max_ret) # 計算所有書籍 price 的最小值 min_ret = models.Book.objects.all().aggregate(Min("price")) print(min_ret) # 計算所有書籍 price 的個數 count_ret = models.Book.objects.all().aggregate(Count("price")) print(count_ret)
運行結果:
生成的是字典類型
分組:
orm.py:
import os if __name__ == '__main__': # 加載 Django 項目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導入 Django,并啟動 Django 項目 import django django.setup() from app01 import models from django.db.models import Count # 查詢每一本書的作者個數 ret = models.Book.objects.all().annotate(author_num=Count("author")) # 返回的是 book 對象,annotate(author_num) 相當于讓 book 對象多了一個 author_num 字段 print(ret) for book in ret: print("書名:{},作者數:{}".format(book.title, book.author_num))
運行結果:
這里的 book.annotate(author_num) 相當于讓 book 對象多了一個 author_num 字段,但并不是在數據庫中多了一個字段
orm.py:
import os if __name__ == '__main__': # 加載 Django 項目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導入 Django,并啟動 Django 項目 import django django.setup() from app01 import models from django.db.models import Count # 查詢作者數大于 1 的書 ret = models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1) print(ret)
運行結果:
orm.py:
import os if __name__ == '__main__': # 加載 Django 項目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導入 Django,并啟動 Django 項目 import django django.setup() from app01 import models from django.db.models import Sum # 查詢各個作者出的書的總價格 ret = models.Author.objects.all().annotate(price_sum=Sum("book__price")) # 獲取所有 author 表數據并添加 price_sum 字段 for i in ret: print(i, i.name, i.price_sum) # 打印所有 author 對象、 author 的 name 字段、price_sum 字段 的數據 # 打印 author 表的所有 id、name、price_sum 字段數據 print(ret.values_list("id", "name", "price_sum"))
運行結果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。