不确定区别是什么。似乎所有管理器都有一堆与模型相关的功能。但这些功能也可以放在模型中....
Django文档描述了Manager,如下所示,
Manager是数据库查询操作的接口 提供给Django模型。
那么管理器还有什么根本不同于这个简单的抽象?
或者更好的问题:在模型与经理中应该定义哪些方法?是否存在实际差异或只是文体差异?
答案 0 :(得分:7)
在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()
也可以multiple managers to a single model
简而言之,管理人员在访问模型的查询集方面提供了很大的灵活性。