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

 更新时间:2025年11月02日 10:21:42   作者:言之。  
Django Manager是ORM的核心数据库操作接口,本文就来详细的介绍一下django model Manager数据库操作接口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

🧩 一、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_length=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,用于不同业务场景:

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=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 的结合

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

✅ 总结表

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

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

相关文章

  • Python处理MySQL与SQLite数据库详解

    Python处理MySQL与SQLite数据库详解

    在数据处理和存储方面,数据库扮演着至关重要的角色,Python提供了多种与数据库交互的方式,本文主要介绍了如何对MySQL与SQLite数据库进行增删改查操作,需要的可以了解下
    2025-02-02
  • 使用Python删除Excel中的行列和单元格示例详解

    使用Python删除Excel中的行列和单元格示例详解

    在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用 Python脚本实现对 Excel 表格的高效自动化处理,感兴趣的可以了解下
    2025-07-07
  • python使用pil库实现图片合成实例代码

    python使用pil库实现图片合成实例代码

    这篇文章主要介绍了python PIL实现图片合成实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Django配置celery(非djcelery)执行异步任务和定时任务

    Django配置celery(非djcelery)执行异步任务和定时任务

    这篇文章主要介绍了Django配置celery(非djcelery)执行异步任务和定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • python关于图片和base64互转的三种方式

    python关于图片和base64互转的三种方式

    无论使用cv2、PIL还是直接读取图片的方法进行图片与Base64的转换,核心步骤都涉及到二进制格式的转换,每种方法的基本过程都是:Base64转二进制,然后二进制转图片,或反向操作,这些方法均基于二进制与图片转换的基本原理
    2024-09-09
  • Python实现bilibili时间长度查询的示例代码

    Python实现bilibili时间长度查询的示例代码

    这篇文章主要介绍了Python实现bilibili时间长度查询的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Python面向对象特殊属性及方法解析

    Python面向对象特殊属性及方法解析

    这篇文章主要介绍了Python面向对象特殊属性及方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Python报错:对象不存在此属性的解决

    Python报错:对象不存在此属性的解决

    这篇文章主要介绍了Python报错:对象不存在此属性的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Python 做曲线拟合和求积分的方法

    Python 做曲线拟合和求积分的方法

    今天小编就为大家分享一篇Python 做曲线拟合和求积分的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python编程快速上手——选择性拷贝操作案例分析

    Python编程快速上手——选择性拷贝操作案例分析

    这篇文章主要介绍了Python选择性拷贝操作,结合具体实例形式分析了Python文件遍历、查找、复制拷贝等相关操作技巧,需要的朋友可以参考下
    2020-02-02

最新评论