不太确定有什么区别。似乎Manager所做的一切就是拥有与模型相关的一堆功能。但是这些功能也可以放在模型中。
Django文档对Manager进行了如下描述,
A Manager is the interface through which database query operations are provided to Django models.
那么,与这种简单的抽象方法相比,管理器在本质上还有什么不同吗?
还是一个更好的问题:在模型与管理器中应定义哪些方法?有实际差异还是只是风格差异?
最佳答案
在Django中,模型管理器是模型通过其执行数据库查询的对象。每个Django模型至少都有一个管理器,即objects
,您可以创建自己的管理器来更改默认行为。
所以,你的陈述
But these functions could also be placed in the Model too
嗯,不是真的,因为该模型仍然依赖于默认管理器来检索查询集。
让我尝试用一个例子来解释。可以说您的应用程序需要一个模型对象来仅显示状态为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
简而言之,管理人员在访问模型的查询集方面具有很大的灵活性。
关于Django模型与管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17320333/