djangomodelManager数据库操作接口的实现

Written by

in

文章目录
  • 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(), 等)。
  • 功能 示例 定义默认查询范围 限制返回的对象(如只显示已发布内容) 添加自定义查询方法 封装复杂查询逻辑 控制默认行为 指定模型默认返回什么数据 逻辑复用 让过滤逻辑集中,不重复写在 view 或 service 里
  • 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篇已发布文章
  • 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,用于不同业务场景: class Article(models.Model): title = models.CharField(max_length=100) is_published = models.BooleanField(default=False) objects = models.Manager() # 默认管理器 published = PublishedManager() # 只看发布的
  • Django 的通用视图(如 ListView)默认使用模型的 第一个定义的 Manager。 如果你想让某个自定义 Manager 成为默认管理器,只需把它放在第一个位置: class Article(models.Model): published = PublishedManager() # 默认被使用 objects = models.Manager()
  • 概念 作用 Manager ORM 查询接口,用于操作数据库 get_queryset() 定义默认查询集 自定义方法 封装业务查询逻辑 自定义 QuerySet 支持链式调用、逻辑复用 多个 Manager 用于区分不同数据视图(如软删除、发布状态) 到此这篇关于django model Manager数据库操作接口的实现的文章就介绍到这了,更多相关django model Manager内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Django如何自定义model创建数据库索引的顺序 Django models filter筛选条件详解 Django对models里的objects的使用详解 关于Django Models CharField 参数说明 django模型中的字段和model名显示为中文小技巧分享 django模型层(model)进行建表、查询与删除的基础教程 Django中Model的使用方法教程 Django中的Model操作表的实现 Django获取model中的字段名和字段的verbose_name方式 Django Model中字段(field)的各种选项说明
  • 目录
    • 🧩 一、Manager 是什么?
    • 🧠 二、Manager 的主要作用
    • ⚙️ 三、定义自定义 Manager
      • ✅ 基本结构
    • 🧩 四、get_queryset()方法详解
      • 🔧 五、添加自定义查询方法
        • 💡 六、与自定义 QuerySet 结合使用(推荐做法)
          • 🧱 七、多个 Manager 的应用场景
            • 🔐 八、Manager 与默认行为
              • 🧰 九、实际应用案例
                • ✅ 示例1:用户权限过滤
                • ✅ 示例2:软删除模型
              • 🧭 十、Manager 与 signals、admin、views 的结合
                • 在 admin 中使用自定义 Manager:
                • 在 views 中使用:
              • ✅ 总结表

                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(), 等)。

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

                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_length=100)
                    is_published = models.BooleanField(default=False)
                
                    # 默认管理器
                    objects = models.Manager()
                    # 自定义管理器
                    published = PublishedManager()
                

                📖 使用效果:

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

                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篇已发布文章
                

                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,用于不同业务场景:

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

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

                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()
                

                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()  # 可访问已删除的
                

                class ArticleAdmin(admin.ModelAdmin):
                    def get_queryset(self, request):
                        return Article.published.all()
                

                def index(request):
                    articles = Article.objects.published().recent()
                    return render(request, 'index.html', {'articles': articles})
                

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

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

                您可能感兴趣的文章:

                • Django如何自定义model创建数据库索引的顺序
                • Django models filter筛选条件详解
                • Django对models里的objects的使用详解
                • 关于Django Models CharField 参数说明
                • django模型中的字段和model名显示为中文小技巧分享
                • django模型层(model)进行建表、查询与删除的基础教程
                • Django中Model的使用方法教程
                • Django中的Model操作表的实现
                • Django获取model中的字段名和字段的verbose_name方式
                • Django Model中字段(field)的各种选项说明

                站内搜索