django model Manager數(shù)據(jù)庫操作接口的實現(xiàn)
?? 一、Manager 是什么?
Manager 是 Django ORM 提供的數(shù)據(jù)庫操作接口。
每個模型(Model)默認(rèn)都有一個管理器 objects,用于執(zhí)行所有數(shù)據(jù)庫查詢。
class Article(models.Model):
title = models.CharField(max_length=100)
# 默認(rèn)存在一個 Manager
Article.objects.all() # 查詢所有文章
Article.objects.filter(...) # 過濾
? Django 在每個 Model 類中自動添加一個 objects = models.Manager()。
你可以通過它訪問 ORM 提供的所有方法(filter(), get(), create(), update(), 等)。
?? 二、Manager 的主要作用
| 功能 | 示例 |
|---|---|
| 定義默認(rèn)查詢范圍 | 限制返回的對象(如只顯示已發(fā)布內(nèi)容) |
| 添加自定義查詢方法 | 封裝復(fù)雜查詢邏輯 |
| 控制默認(rèn)行為 | 指定模型默認(rèn)返回什么數(shù)據(jù) |
| 邏輯復(fù)用 | 讓過濾邏輯集中,不重復(fù)寫在 view 或 service 里 |
?? 三、定義自定義 Manager
? 基本結(jié)構(gòu)
from django.db import models
class PublishedManager(models.Manager):
def get_queryset(self):
# 定義默認(rèn)返回的數(shù)據(jù)范圍
return super().get_queryset().filter(is_published=True)
然后在模型中使用它:
class Article(models.Model):
title = models.CharField(max_length=100)
is_published = models.BooleanField(default=False)
# 默認(rèn)管理器
objects = models.Manager()
# 自定義管理器
published = PublishedManager()
?? 使用效果:
Article.objects.all() # 所有文章 Article.published.all() # 只返回已發(fā)布的文章
?? 四、get_queryset()方法詳解
get_queryset() 是 Manager 的核心方法,用來定義默認(rèn)查詢集(QuerySet)。
Django 的所有 ORM 操作最終都是基于這個 QuerySet。
示例:
class ActiveUserManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_active=True)
使用:
User.active.all() # 只返回活躍用戶 User.objects.all() # 所有用戶
?? 五、添加自定義查詢方法
你可以在 Manager 中添加業(yè)務(wù)邏輯方法。
class ArticleManager(models.Manager):
def published(self):
return self.get_queryset().filter(is_published=True)
def recent(self):
return self.get_queryset().order_by('-created_at')[:5]
使用:
Article.objects.published() # 只返回發(fā)布的文章 Article.objects.published().recent() # 最近5篇已發(fā)布文章
?? 六、與自定義 QuerySet 結(jié)合使用(推薦做法)
Django 推薦將復(fù)雜查詢邏輯放入自定義 QuerySet,再讓 Manager 使用它。
class ArticleQuerySet(models.QuerySet):
def published(self):
return self.filter(is_published=True)
def recent(self):
return self.order_by('-created_at')
然后定義 Manager:
class ArticleManager(models.Manager):
def get_queryset(self):
return ArticleQuerySet(self.model, using=self._db)
# 讓 Manager 支持鏈?zhǔn)秸{(diào)用
def published(self):
return self.get_queryset().published()
模型:
class Article(models.Model):
title = models.CharField(max_length=100)
is_published = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
objects = ArticleManager()
?? 調(diào)用:
Article.objects.published().recent()
? 優(yōu)點:
- 支持鏈?zhǔn)秸{(diào)用
- QuerySet 與 Manager 邏輯分層更清晰
- 更容易測試與復(fù)用
?? 七、多個 Manager 的應(yīng)用場景
你可以為同一個模型定義多個 Manager,用于不同業(yè)務(wù)場景:
class Article(models.Model):
title = models.CharField(max_length=100)
is_published = models.BooleanField(default=False)
objects = models.Manager() # 默認(rèn)管理器
published = PublishedManager() # 只看發(fā)布的
?? 八、Manager 與默認(rèn)行為
- Django 的通用視圖(如
ListView)默認(rèn)使用模型的 第一個定義的 Manager。 - 如果你想讓某個自定義 Manager 成為默認(rèn)管理器,只需把它放在第一個位置:
class Article(models.Model):
published = PublishedManager() # 默認(rèn)被使用
objects = models.Manager()
?? 九、實際應(yīng)用案例
? 示例1:用戶權(quán)限過濾
class UserQuerySet(models.QuerySet):
def active(self):
return self.filter(is_active=True)
def staff(self):
return self.filter(is_staff=True)
class UserManager(models.Manager):
def get_queryset(self):
return UserQuerySet(self.model, using=self._db)
def active(self):
return self.get_queryset().active()
User.objects.active().staff()
? 示例2:軟刪除模型
class SoftDeleteManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_deleted=False)
class Post(models.Model):
title = models.CharField(max_length=100)
is_deleted = models.BooleanField(default=False)
objects = SoftDeleteManager()
all_objects = models.Manager() # 可訪問已刪除的
?? 十、Manager 與 signals、admin、views 的結(jié)合
在 admin 中使用自定義 Manager:
class ArticleAdmin(admin.ModelAdmin):
def get_queryset(self, request):
return Article.published.all()
在 views 中使用:
def index(request):
articles = Article.objects.published().recent()
return render(request, 'index.html', {'articles': articles})
? 總結(jié)表
| 概念 | 作用 |
|---|---|
| Manager | ORM 查詢接口,用于操作數(shù)據(jù)庫 |
| get_queryset() | 定義默認(rèn)查詢集 |
| 自定義方法 | 封裝業(yè)務(wù)查詢邏輯 |
| 自定義 QuerySet | 支持鏈?zhǔn)秸{(diào)用、邏輯復(fù)用 |
| 多個 Manager | 用于區(qū)分不同數(shù)據(jù)視圖(如軟刪除、發(fā)布狀態(tài)) |
到此這篇關(guān)于django model Manager數(shù)據(jù)庫操作接口的實現(xiàn)的文章就介紹到這了,更多相關(guān)django model Manager內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Django如何自定義model創(chuàng)建數(shù)據(jù)庫索引的順序
- Django models filter篩選條件詳解
- Django對models里的objects的使用詳解
- 關(guān)于Django Models CharField 參數(shù)說明
- django模型中的字段和model名顯示為中文小技巧分享
- django模型層(model)進行建表、查詢與刪除的基礎(chǔ)教程
- Django中Model的使用方法教程
- Django中的Model操作表的實現(xiàn)
- Django獲取model中的字段名和字段的verbose_name方式
- Django Model中字段(field)的各種選項說明
相關(guān)文章
Python處理MySQL與SQLite數(shù)據(jù)庫詳解
在數(shù)據(jù)處理和存儲方面,數(shù)據(jù)庫扮演著至關(guān)重要的角色,Python提供了多種與數(shù)據(jù)庫交互的方式,本文主要介紹了如何對MySQL與SQLite數(shù)據(jù)庫進行增刪改查操作,需要的可以了解下2025-02-02
Django配置celery(非djcelery)執(zhí)行異步任務(wù)和定時任務(wù)
這篇文章主要介紹了Django配置celery(非djcelery)執(zhí)行異步任務(wù)和定時任務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
python關(guān)于圖片和base64互轉(zhuǎn)的三種方式
無論使用cv2、PIL還是直接讀取圖片的方法進行圖片與Base64的轉(zhuǎn)換,核心步驟都涉及到二進制格式的轉(zhuǎn)換,每種方法的基本過程都是:Base64轉(zhuǎn)二進制,然后二進制轉(zhuǎn)圖片,或反向操作,這些方法均基于二進制與圖片轉(zhuǎn)換的基本原理2024-09-09
Python實現(xiàn)bilibili時間長度查詢的示例代碼
這篇文章主要介紹了Python實現(xiàn)bilibili時間長度查詢的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

