Django ORM:values()和annotate()方法的使用
1. values()方法
1.1 基本概念
values()
方法用于返回一個(gè)包含字典的QuerySet,而不是模型實(shí)例。每個(gè)字典表示一個(gè)對象,鍵對應(yīng)于模型字段名稱。
1.2 基本用法
# 獲取所有書籍的標(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)查詢
# 獲取書籍及其作者姓名 books = Book.objects.values('title', 'author__name')
2. annotate()方法
2.1 基本概念
annotate()
用于給QuerySet中的每個(gè)對象添加計(jì)算字段(注解),通常與聚合函數(shù)一起使用。
2.2 基本用法
from django.db.models import Count from myapp.models import Author # 計(jì)算每位作者的書籍?dāng)?shù)量 authors = Author.objects.annotate(book_count=Count('book')) # 現(xiàn)在每個(gè)author對象都有一個(gè)book_count屬性
2.3 常用聚合函數(shù)
Count()
: 計(jì)數(shù)Sum()
: 求和Avg()
: 平均值Max()
: 最大值Min()
: 最小值
3. values()和annotate()的組合使用
3.1 分組統(tǒng)計(jì)
# 按出版社分組統(tǒng)計(jì)書籍?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è)對象添加注解
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ù)庫層面完成計(jì)算,而不是在Python中
- 對大型數(shù)據(jù)集考慮使用iterator()
課后練習(xí)
- 使用values()和annotate()統(tǒng)計(jì)每個(gè)出版社出版的書籍?dāng)?shù)量
- 計(jì)算每個(gè)作者的書籍平均評分
- 找出每年出版書籍最多的月份
總結(jié)
values()和annotate()是Django ORM中強(qiáng)大的工具,能夠高效地進(jìn)行數(shù)據(jù)查詢和統(tǒng)計(jì)分析。理解它們的區(qū)別和組合使用方式,可以大大提升開發(fā)效率和查詢性能。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- django使用sqlite3統(tǒng)計(jì)前臺(tái)站點(diǎn)訪問數(shù)量示例
- Django把SQLite數(shù)據(jù)庫轉(zhuǎn)換為Mysql數(shù)據(jù)庫的過程
- Django數(shù)據(jù)庫(SQlite)基本入門使用教程
- django 將自帶的數(shù)據(jù)庫sqlite3改成mysql實(shí)例
- Django 創(chuàng)建后臺(tái),配置sqlite3教程
- Django將默認(rèn)的SQLite更換為MySQL的實(shí)現(xiàn)
- DJango的創(chuàng)建和使用詳解(默認(rèn)數(shù)據(jù)庫sqlite3)
相關(guān)文章
將Python代碼打包成可調(diào)用SDK的四種方法小結(jié)(適用于移動(dòng)端 App)
Python是一門功能強(qiáng)大、生態(tài)豐富的語言,廣泛用于數(shù)據(jù)處理、機(jī)器學(xué)習(xí)和后端服務(wù),然而,Python并不是原生的移動(dòng)端開發(fā)語言,如果希望在移動(dòng)端App中調(diào)用Python代碼,最好的方式是將Python代碼打包成SDK,所以本文給大家介紹了幾種Python代碼打包成可調(diào)用SDK的方法2025-04-04pytorch 兩個(gè)GPU同時(shí)訓(xùn)練的解決方案
這篇文章主要介紹了pytorch 兩個(gè)GPU同時(shí)訓(xùn)練的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06關(guān)于jupyter打開之后不能直接跳轉(zhuǎn)到瀏覽器的解決方式
這篇文章主要介紹了關(guān)于jupyter打開之后不能直接跳轉(zhuǎn)到瀏覽器的解決方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04python 判斷三個(gè)數(shù)字中的最大值實(shí)例代碼
這篇文章主要介紹了python 判斷三個(gè)數(shù)字中的最大值,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07基于Python數(shù)據(jù)結(jié)構(gòu)之遞歸與回溯搜索
今天小編就為大家分享一篇基于Python數(shù)據(jù)結(jié)構(gòu)之遞歸與回溯搜索,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python執(zhí)行錯(cuò)誤“由于找不到python39.dll,無法繼續(xù)執(zhí)行代碼”解決的步驟
這篇文章主要介紹了在Python開發(fā)中遇到“找不到python39.dll”的錯(cuò)誤,并提供了詳細(xì)的解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12