Django ORM:values()和annotate()方法的使用
1. values()方法
1.1 基本概念
values()方法用于返回一個(gè)包含字典的QuerySet,而不是模型實(shí)例。每個(gè)字典表示一個(gè)對(duì)象,鍵對(duì)應(yīng)于模型字段名稱。
1.2 基本用法
# 獲取所有書(shū)籍的標(biāo)題和出版日期
from myapp.models import Book
books = Book.objects.values('title', 'pub_date')
# 返回結(jié)果示例: [{'title': 'Django入門', 'pub_date': datetime.date(2023, 1, 1)}, ...]
1.3 特點(diǎn)
- 只獲取指定字段,減少內(nèi)存使用
- 結(jié)果以字典形式返回,而不是模型實(shí)例
- 可以用于跨模型關(guān)系查詢
1.4 關(guān)聯(lián)查詢
# 獲取書(shū)籍及其作者姓名
books = Book.objects.values('title', 'author__name')

2. annotate()方法
2.1 基本概念
annotate()用于給QuerySet中的每個(gè)對(duì)象添加計(jì)算字段(注解),通常與聚合函數(shù)一起使用。
2.2 基本用法
from django.db.models import Count
from myapp.models import Author
# 計(jì)算每位作者的書(shū)籍?dāng)?shù)量
authors = Author.objects.annotate(book_count=Count('book'))
# 現(xiàn)在每個(gè)author對(duì)象都有一個(gè)book_count屬性
2.3 常用聚合函數(shù)
Count(): 計(jì)數(shù)Sum(): 求和Avg(): 平均值Max(): 最大值Min(): 最小值
3. values()和annotate()的組合使用
3.1 分組統(tǒng)計(jì)
# 按出版社分組統(tǒng)計(jì)書(shū)籍?dāng)?shù)量
from django.db.models import Count
stats = Book.objects.values('publisher').annotate(count=Count('id'))
# 返回結(jié)果示例: [{'publisher': 'A出版社', 'count': 5}, ...]
3.2 多字段分組
# 按作者和出版年份分組統(tǒng)計(jì)
stats = Book.objects.values('author', 'pub_date__year').annotate(count=Count('id'))
3.3 注意事項(xiàng)
values()在annotate()之前使用會(huì)改變分組依據(jù)annotate()在values()之前使用會(huì)為每個(gè)對(duì)象添加注解
4. 實(shí)際案例
4.1 博客系統(tǒng)統(tǒng)計(jì)
# 統(tǒng)計(jì)每個(gè)分類下的文章數(shù)量和平均閱讀量
from django.db.models import Count, Avg
stats = Post.objects.values('category').annotate(
post_count=Count('id'),
avg_views=Avg('views')
)
4.2 電商系統(tǒng)分析
# 統(tǒng)計(jì)每個(gè)用戶的總消費(fèi)金額和訂單數(shù)
from django.db.models import Sum, Count
user_stats = Order.objects.values('user').annotate(
total_spent=Sum('amount'),
order_count=Count('id')
)
5. 性能優(yōu)化建議
- 只查詢需要的字段
- 合理使用select_related和prefetch_related
- 在數(shù)據(jù)庫(kù)層面完成計(jì)算,而不是在Python中
- 對(duì)大型數(shù)據(jù)集考慮使用iterator()
課后練習(xí)
- 使用values()和annotate()統(tǒng)計(jì)每個(gè)出版社出版的書(shū)籍?dāng)?shù)量
- 計(jì)算每個(gè)作者的書(shū)籍平均評(píng)分
- 找出每年出版書(shū)籍最多的月份
總結(jié)
values()和annotate()是Django ORM中強(qiáng)大的工具,能夠高效地進(jìn)行數(shù)據(jù)查詢和統(tǒng)計(jì)分析。理解它們的區(qū)別和組合使用方式,可以大大提升開(kāi)發(fā)效率和查詢性能。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- django使用sqlite3統(tǒng)計(jì)前臺(tái)站點(diǎn)訪問(wèn)數(shù)量示例
- Django把SQLite數(shù)據(jù)庫(kù)轉(zhuǎn)換為Mysql數(shù)據(jù)庫(kù)的過(guò)程
- Django數(shù)據(jù)庫(kù)(SQlite)基本入門使用教程
- django 將自帶的數(shù)據(jù)庫(kù)sqlite3改成mysql實(shí)例
- Django 創(chuàng)建后臺(tái),配置sqlite3教程
- Django將默認(rèn)的SQLite更換為MySQL的實(shí)現(xiàn)
- DJango的創(chuàng)建和使用詳解(默認(rèn)數(shù)據(jù)庫(kù)sqlite3)
相關(guān)文章
Python經(jīng)典五人分魚(yú)實(shí)例講解
在本篇文章里小編給大家分享的是一篇關(guān)于Python 五人分魚(yú)的經(jīng)典小游戲?qū)嵗齼?nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01
pytorch中的named_parameters()和parameters()
這篇文章主要介紹了pytorch中的named_parameters()和parameters()使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
python 自動(dòng)化偷懶的四個(gè)實(shí)用操作
這篇文章主要介紹了python 自動(dòng)化偷懶的四個(gè)實(shí)用操作,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
python使用reportlab實(shí)現(xiàn)圖片轉(zhuǎn)換成pdf的方法
這篇文章主要介紹了python使用reportlab實(shí)現(xiàn)圖片轉(zhuǎn)換成pdf的方法,涉及Python使用reportlab模塊操作圖片轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-05-05
python針對(duì)Oracle常見(jiàn)查詢操作實(shí)例分析
這篇文章主要介紹了python針對(duì)Oracle常見(jiàn)查詢操作,結(jié)合實(shí)例形式分析了python針對(duì)Oracle常見(jiàn)的子查詢、多表查詢等相關(guān)原理、操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-04-04
利用python實(shí)現(xiàn)簡(jiǎn)易版的貪吃蛇游戲(面向python小白)
這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)簡(jiǎn)易版的貪吃蛇游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12

