10

不太确定有什么区别。似乎 Manager 所做的只是拥有一堆与模型相关的功能。但是这些功能也可以放在模型中......

Django 文档对 Manager 的描述如下,

管理器是向 Django 模型提供数据库查询操作的接口。

那么除了这个简单的抽象之外,Manager 还有什么根本不同的地方吗?

或者一个更好的问题:在模型和管理器中应该定义什么方法?有实际差异还是只是风格上的差异?

4

1 回答 1

12

在 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()

一个模型也可以有多个管理器

简而言之,管理器在访问模型的查询集方面提供了很大的灵活性。

于 2013-06-26T14:07:18.503 回答