开发者

django model Manager数据库操作接口的实现

开发者 https://www.devze.com 2025-11-05 09:57 出处:网络 作者: 言之。
目录 一、Manager 是什么? 二、Manager 的主要作用⚙️ 三、定义自定义 Manager✅ 基本结构 四、get_queryset()方法详解 五、添加自定义查询方法 六、与自定义 QuerySet 结合使用(推荐做法) 七、多个 Manager 的应
目录
  • 一、Manager 是什么?
  • 二、Manager 的主要作用
  • ⚙️ 三、定义自定义 Manager
    • ✅ 基本结构
  • 四、get_queryset()方法详解
    • 五、添加自定义查询方法
      • 六、与自定义 QuerySet 结合使用(推荐做法)
        • 七、多个 Manager 的应用场景
          • 八、Manager 与默认行为
            • 九、实际应用案例
              • ✅ 示例1:用户权限过滤
              • ✅ 示例2:软删除模型
            • 十、Manager 与 signals、admin、views 的结合
              • 在 admin 中使用自定义 Manager:
              • 在 views 中使用:
            • ✅ 总结表

              一、Manager 是什么?

              Manager 是 Django ORM 提供的数据库操作接口。

              每个模型(Model)默认都有一个管理器 objects,用于执行所有数据库查编程客栈询。

              class Article(models.Model):
                  title = models.CharField(max_length=100)
              
              # 默认存在一个 Manager
              Article.objects.all()      # 查询所有文章
              Article.objects.filter(...)  # 过滤
              

              ✅ Django 在每个 Model 类中自动添加一个 objects = models.Manager()

              你可以通过它访问 ORM 提供的所有方法(filter(), get(), create(), update(), 等)。

              二、Manager 的主要作用

              功能示例
              定义默认查询范围限制返回的对象(如只显示已发布内容)
              添加自定义查询方法封装复杂查询逻辑
              控制默认行为指定模型默认返回什么数据
              逻辑复用让过滤逻辑集中,不重复写在 view 或 service 里

              ⚙️ 三、定义自定义 Manager

              ✅ 基本结构

              from django.db import models
              
              class PublishedManager(models.Manager):
                  def get_queryset(self):
                      # 定义默认返回的数据范围
                      return super().get_queryset().filter(is_published=True)
              

              然后在模型中使用它:

              class Article(models.Model):
                  title = models.CharField(max_lejavascriptngth=100)
                  is_published = models.BooleanField(default=False)
              
                  # 默认管理器
                  objects = models.Manager()
                  # 自定义管理器
                  published = PublishedManager()
              

              使用效果:

              Article.objects.all()        # 所有文章
              Article.published.all()      # 只返回已发布的文章
              

              四、get_queryset()方法详解

              get_queryset() 是 Manager 的核心方法,用来定义默认查询集(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 中添加业务逻辑方法

              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()       # 只返回发布的文章
              Article.objects.published().recent()  # 最近5篇已发布文章
              

              六、与自定义 QuerySet 结合使用(推荐做法)

              Django 推荐将复杂查询逻辑放入自定义 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 支持链式调用
                  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()
              

              调用:

              Article.objects.published().recent()
              

              ✅ 优点:

              • 支持链式调用
              • QuerySet 与 Manager 逻辑分层更清晰
              • 更容易测试与复用

              七、多个 Manager 的应用场景

              你可以为同一个模型定义多个 Manager,用于不同业务场景:www.devze.com

              class Article(models.Model):
                  title = models.CharField(max_length=100)
                  is_published = models.BooleanField(default=False)
              
                  objects = models.Manager()       # 默认管理器
                  published = PublishedManager()   # 只看发布的
              

              八、Manager 与默认行为

              • Django 的通用视图(如 ListView)默认使用模型的 第一个定义的 Manager
              • 如果你想让某个自定义 Manager 成为默认管理器,只需把它放在第一个位置:
              class Article(models.Model):
                  published = PublishedManager()   # 默认被使用
                  objects = models.Manager()
              

              九、实际应用案例

              ✅ 示例1:用户权限过滤

              class UserQuerySet(models.QuerySet):
                  def active(self):
                      return self.filter(is_active=Trueandroid)
                  
                  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 的结合

              在 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})
              

              ✅ 总结表

              概念作用
              Manage编程rORM 查询接口,用于操作数据库
              get_queryset()定义默认查询集
              自定义方法封装业务查询逻辑
              自定义 QuerySet支持链式调用、逻辑复用
              多个 Manager用于区分不同数据视图(如软删除、发布状态)

              到此这篇关于django model Manager数据库操作接口的实现的文章就介绍到这了,更多相关django model Manager内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

              0

              精彩评论

              暂无评论...
              验证码 换一张
              取 消

              关注公众号