Django模型与管理器

标签 django django-models django-managers

不太确定有什么区别。似乎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/

相关文章:

python - Django:有没有办法在嵌套文件夹中加载模板?

python - 为什么选择字段显示键而不是 Django 查询集中的值?

django CMS 登录时不显示工具栏

python - 如何扩展 Django Group 模型?

django - 用户管理器方法 create() 和 create_user()

python - 如何在基于类的 View 中编写自己的方法并调用 url 中的方法

mysql - 从两个表中连接选择

django - django 形式的多个复选框

django - 如何在反向关系中使用自定义管理器?

django模型ManyToManyField不通过管理器