Django模型与管理器的区别

11

我不太确定两者的区别。看起来,Manager只是具有与Model相关的一堆函数。但这些函数也可以放在Model中....

Django文档如下描述了Manager:

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

那么,Manager除了这个简单的抽象之外还有什么根本上的区别吗?

或者更好的问题是:哪些方法应该在Model中定义,哪些应该在Manager中定义?实际上是否有区别,还是只是风格上的区别?


2
实际上,我会说管理器是Django的做法,而直接在模型中进行操作是一种快捷方式(通常情况下,您将Manager实例设置为模型属性)。使用管理器有助于覆盖“get_queryset”方法,这将自动更改在管理页面中显示的内容。但是没有根本性的变化:如果您导入了模块,可以在模型的任何地方调用操作,这就是Python的奇怪之处:没有私有^^ - Ricola3D
1
Manager是一个Python对象,它管理您的应用程序与在settings.py中定义的特定数据库之间的连接。Models是您在db内部定义应用程序表的方式。 - Below the Radar
1个回答

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

一个模型可以拥有多个管理器,这也是可能的

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


7
您是否应该覆盖 ModelManager 上的方法,而不是 ModelAdmin? - wobbily_col

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接