本文目录导读:

是的,Django 模型管理器(Model Manager)从 Django 的早期版本开始就可以通过继承 models.Manager 来自定义新增方法,这并不是某个特定版本的新特性,而是 Django ORM 一直支持的核心功能。
虽然你问的是“新增了方法吗”,可能是在问 Django 官方是否最近给默认管理器新增了方法(例如在 Django 5.x 中),但更常见的需求是开发者自己为模型管理器添加自定义方法以实现更优雅的查询封装。
下面我将从自定义管理器方法和Django 近几个版本中管理器相关的更新两个角度来回答。
如何为模型管理器新增自定义方法(核心功能)
你可以通过继承 models.Manager 并添加自己的方法来实现,这是最常用的方式。
from django.db import models
class BookManager(models.Manager):
# 新增一个自定义方法
def published_this_year(self, year):
from datetime import datetime
return self.filter(publish_date__year=year)
# 也可以重写 get_queryset 来默认过滤
def get_queryset(self):
return super().get_queryset().filter(is_deleted=False)
class Book(models.Model):= models.CharField(max_length=100)
publish_date = models.DateField()
is_deleted = models.BooleanField(default=False)
# 使用自定义管理器
objects = BookManager()
使用:
books = Book.objects.published_this_year(2025)
Django 近几个版本中管理器相关的更新
虽然新增自定义方法不是新特性,但 Django 在近几个版本(Django 4.x、5.x)中对管理器/查询集做了一些重要的增强:
| 版本 | 说明 | |
|---|---|---|
| Django 5.0(2023年12月) | 引入了 QuerySet.iterator() 的 chunk_size 参数优化 |
虽然主要影响查询集,但管理器返回查询集,间接受益 |
| Django 4.2(2023年4月) | 允许在 Manager 中使用 from_queryset() 时保留自定义 QS 方法 |
以前 from_queryset() 会丢失自定义 QS 方法,现在可以保留 |
| Django 4.0(2021年12月) | QuerySet 支持 union()、intersection()、difference() 等集合操作 |
这些方法可以直接在管理器返回的查询集上调用 |
从 Django 4.2 开始的一个实用增强:
如果你同时自定义了 Manager 和 QuerySet,以前通过 Manager.from_queryset() 组合时,自定义的方法可能会丢失,现在可以正常使用了:
class BookQuerySet(models.QuerySet):
def popular(self):
return self.filter(rating__gte=4)
class BookManager(models.Manager):
def get_queryset(self):
return BookQuerySet(self.model, using=self._db)
def popular_books(self):
return self.get_queryset().popular()
# 或者使用 from_queryset 合并
class BookManager(models.Manager):
pass
# 动态创建合并后的管理器
MyManager = BookManager.from_queryset(BookQuerySet)
常见误解澄清
| 误解 | 事实 |
|---|---|
“管理器新增了方法是指 Django 官方给 objects 加了新方法?” |
不是,官方很少直接给默认管理器加方法,主要是允许开发者自定义。 |
| “新增方法必须在模型定义时做?” | 不一定,你也可以在运行时通过 ContributeToClass 或元类动态添加,但很少用。 |
| “管理器方法只能返回查询集?” | 不一定,可以返回任何值(如 bool、int、list),但通常返回查询集保持链式调用。 |
- Django 模型管理器从始至终都支持新增方法,这不是新特性,而是你作为开发者可以主动利用的功能。
- 如果你听到“管理器新增了方法”,很可能是指 某个第三方包或你团队的代码 新增了自定义管理器方法,而不是 Django 官方。
- 最近几个版本的 Django 主要是在查询集链式操作和组合能力上做了增强,间接让管理器更强大。
如果你有具体的场景(比如想封装复杂的过滤逻辑、分页、缓存等),可以告诉我,我可以帮你写一个示例管理器。