不太确定有什么区别。似乎 Manager 所做的只是拥有一堆与模型相关的功能。但是这些功能也可以放在模型中......
Django 文档对 Manager 的描述如下,
管理器是向 Django 模型提供数据库查询操作的接口。
那么除了这个简单的抽象之外,Manager 还有什么根本不同的地方吗?
或者一个更好的问题:在模型和管理器中应该定义什么方法?有实际差异还是只是风格上的差异?
不太确定有什么区别。似乎 Manager 所做的只是拥有一堆与模型相关的功能。但是这些功能也可以放在模型中......
Django 文档对 Manager 的描述如下,
管理器是向 Django 模型提供数据库查询操作的接口。
那么除了这个简单的抽象之外,Manager 还有什么根本不同的地方吗?
或者一个更好的问题:在模型和管理器中应该定义什么方法?有实际差异还是只是风格上的差异?
在 Django 中,模型管理器是模型执行数据库查询的对象。每个 Django 模型至少有一个管理器,即objects
,您可以创建自己的管理器来更改默认行为。
所以,你的陈述
但是这些功能也可以放在模型中
好吧,并不是因为模型仍然依赖于默认管理器来检索查询集。
让我试着用一个例子来解释。假设您的应用程序需要一个模型对象来仅显示状态为published
. 现在,MyModel.objects.all()
检索所有内容,您必须MyModel.objects.filter(published=True)
每次都指定过滤器。
现在,您可以覆盖此默认行为。
class MyModelAdmin(admin.ModelAdmin):
def queryset(self, request):
return MyModel.objects.filter(published=True)
我们刚刚所做的是覆盖默认管理器的默认行为。
现在,假设你想要一切,你可以做类似的事情
class MyModelAdmin(admin.ModelAdmin):
def queryset(self, request):
return MyModel.objects.filter(published=True)
def all_objects(self, request):
return MyModel.objects.all()
在访问所有对象时,只需执行
MyModel.objects.all_objects()
一个模型也可以有多个管理器
简而言之,管理器在访问模型的查询集方面提供了很大的灵活性。