Django模型与经理

时间:2013-06-26 12:41:52

标签: django django-models django-managers

不确定区别是什么。似乎所有管理器都有一堆与模型相关的功能。但这些功能也可以放在模型中....

Django文档描述了Manager,如下所示,

  

Manager是数据库查询操作的接口   提供给Django模型。

那么管理器还有什么根本不同于这个简单的抽象?

或者更好的问题:在模型与经理中应该定义哪些方法?是否存在实际差异或只是文体差异?

1 个答案:

答案 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

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