Django ORM 聚合查詢(xún)和分組查詢(xún)實(shí)現(xiàn)詳解
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) # 書(shū)籍 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) # 最長(zhǎng)位數(shù)為 5,小數(shù)位數(shù)為 2,默認(rèn)值為 00.00 publisher = models.ForeignKey(to="Publisher", null=True) # 把 null 設(shè)置為 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") # 多對(duì)多關(guān)聯(lián) Book 表,ORM 會(huì)自動(dòng)生成第 3 張表 def __str__(self): return "<Author object: {}>".format(self.name)
book 表:
修改 price
聚合查詢(xún):
aggregate():返回一個(gè)包含一些鍵值對(duì)的字典。
鍵的名稱(chēng)是聚合值的標(biāo)識(shí)符,值是計(jì)算出來(lái)的聚合值。鍵的名稱(chēng)是按照字段和聚合函數(shù)的名稱(chēng)自動(dòng)生成出來(lái)的。
orm.py:
import os if __name__ == '__main__': # 加載 Django 項(xiàng)目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導(dǎo)入 Django,并啟動(dòng) Django 項(xiàng)目 import django django.setup() from app01 import models # 聚合查詢(xún)需要導(dǎo)入的函數(shù) from django.db.models import Avg, Sum, Max, Min, Count # 計(jì)算所有書(shū)籍 price 的平均值 avg_ret = models.Book.objects.all().aggregate(Avg("price")) print(avg_ret) # 計(jì)算所有書(shū)籍 price 的總和 sum_ret = models.Book.objects.all().aggregate(Sum("price")) print(sum_ret) # 計(jì)算所有書(shū)籍 price 的最大值 max_ret = models.Book.objects.all().aggregate(Max("price")) print(max_ret) # 計(jì)算所有書(shū)籍 price 的最小值 min_ret = models.Book.objects.all().aggregate(Min("price")) print(min_ret) # 計(jì)算所有書(shū)籍 price 的個(gè)數(shù) count_ret = models.Book.objects.all().aggregate(Count("price")) print(count_ret)
運(yùn)行結(jié)果:
生成的是字典類(lèi)型
分組:
orm.py:
import os if __name__ == '__main__': # 加載 Django 項(xiàng)目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導(dǎo)入 Django,并啟動(dòng) Django 項(xiàng)目 import django django.setup() from app01 import models from django.db.models import Count # 查詢(xún)每一本書(shū)的作者個(gè)數(shù) ret = models.Book.objects.all().annotate(author_num=Count("author")) # 返回的是 book 對(duì)象,annotate(author_num) 相當(dāng)于讓 book 對(duì)象多了一個(gè) author_num 字段 print(ret) for book in ret: print("書(shū)名:{},作者數(shù):{}".format(book.title, book.author_num))
運(yùn)行結(jié)果:
這里的 book.annotate(author_num) 相當(dāng)于讓 book 對(duì)象多了一個(gè) author_num 字段,但并不是在數(shù)據(jù)庫(kù)中多了一個(gè)字段
orm.py:
import os if __name__ == '__main__': # 加載 Django 項(xiàng)目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導(dǎo)入 Django,并啟動(dòng) Django 項(xiàng)目 import django django.setup() from app01 import models from django.db.models import Count # 查詢(xún)作者數(shù)大于 1 的書(shū) ret = models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1) print(ret)
運(yùn)行結(jié)果:
orm.py:
import os if __name__ == '__main__': # 加載 Django 項(xiàng)目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 導(dǎo)入 Django,并啟動(dòng) Django 項(xiàng)目 import django django.setup() from app01 import models from django.db.models import Sum # 查詢(xún)各個(gè)作者出的書(shū)的總價(jià)格 ret = models.Author.objects.all().annotate(price_sum=Sum("book__price")) # 獲取所有 author 表數(shù)據(jù)并添加 price_sum 字段 for i in ret: print(i, i.name, i.price_sum) # 打印所有 author 對(duì)象、 author 的 name 字段、price_sum 字段 的數(shù)據(jù) # 打印 author 表的所有 id、name、price_sum 字段數(shù)據(jù) print(ret.values_list("id", "name", "price_sum"))
運(yùn)行結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問(wèn)題
今天小編就為大家分享一篇解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07VSCode運(yùn)行或調(diào)試python文件無(wú)反應(yīng)的問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于VSCode運(yùn)行或調(diào)試python文件無(wú)反應(yīng)的問(wèn)題解決,使用VScode編譯運(yùn)行C/C++沒(méi)有問(wèn)題,但是運(yùn)行Python的時(shí)候出了問(wèn)題,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-07-07Python面向?qū)ο笾?lèi)的定義與繼承用法示例
這篇文章主要介紹了Python面向?qū)ο笾?lèi)的定義與繼承用法,結(jié)合實(shí)例形式分析了Python類(lèi)的定義、實(shí)例化、繼承等基本操作技巧,需要的朋友可以參考下2019-01-01Python實(shí)現(xiàn)多個(gè)視頻合成一個(gè)視頻的功能
這篇文章主要介紹了可以將多個(gè)視頻拼接為一個(gè)視頻的Python工具代碼,文中的代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,快來(lái)跟隨小編一起學(xué)習(xí)一下吧2021-12-12python使用paramiko模塊通過(guò)ssh2協(xié)議對(duì)交換機(jī)進(jìn)行配置的方法
今天小編就為大家分享一篇python使用paramiko模塊通過(guò)ssh2協(xié)議對(duì)交換機(jī)進(jìn)行配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07