当前位置: 首页 > news >正文

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 modelsclass 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用于区分不同数据视图(如软删除、发布状态)
http://www.dtcms.com/a/540562.html

相关文章:

  • 前端数据可视化实战:Chart.js vs ECharts 深度对比与实现指南
  • 霍山县网站建设公司寻花问柳专注做一家男人最爱的网站
  • LInux(一)VMware虚拟机中安装CentOS7
  • MATLAB基于对数灰关联度的IOWGA算子最优组合预测模型
  • 企业开源网站系统网页制作软件
  • Linux存储软件栈剖析之第4篇:Linux文件系统的实现
  • Excel怎么将八位数字设置为日期格式?
  • 怎么做系部网站首页做外贸的零售网站
  • 宁波企业网站排名优化公司网络系统管理技能大赛答案
  • 本地网站源码便民信息发布平台
  • Linux 内核内存屏障(中文译文)
  • “二分查找” 咋用?像 “查字典翻页码”,3 步找到目标值​
  • 在Ubuntu中使用Docker打包程序(Conda, pip)
  • 网站优化软件费用大连网站推广优化
  • 31_AI智能体工具插件之增强LangChain注册工具构建高效可控的AI工具生态
  • 怎么做自建站wordpress 导航加图标
  • 解决uni-app通用上传与后端接口不匹配问题:原生上传文件方法封装 ✨
  • 管廊建设网站线上推广网络公司
  • 汽车交互式系统专利拆解:VR/AR 画面生成与挡风玻璃异步转换的流畅性测试
  • Python爬虫实战:中信标普 50 指数数据获取与趋势分析
  • 浦江网站建设站酷app
  • 什么是技术架构、数据架构、业务架构、应用架构、产品架构和项目架构?
  • LLaMA-Factory 集成了哪些超参数调优框架?及 Optuna + Weights Biases + TensorBoard对比分析
  • 【软考架构】案例分析:MongoDB 如何存储非结构化数据以及其矢量化存储的优点。
  • 网络共享总失败?先检查是否有计算机名冲突
  • 最好用的企业网站cms湘潭网站建设工作室
  • 在网站后台做网页河南省工程建设协会网站
  • 【k8s】Deployment、StatefulSet、DaemonSet
  • 优购物官方网站订单查询烟台建设科技网站
  • qrc机制——Qt