一尘不染

直接在Model类上使用Django Managers和staticmethod

python

在阅读了Django
Managers之后,我仍然不确定使用它会带来多少好处。似乎最好的用法是添加自定义查询(只读)方法,例如XYZ.objects.findBy*()。但是我可以使用Model类本身之外的静态方法轻松地做到这一点。

我总是更喜欢后者,因为:

  1. 从可读性和易于维护的角度讲代码的局部性
  2. 由于我objects在通话中不需要该属性,因此略微冗长
  3. Manager 类具有关于模型继承的怪异规则,最好不要这样做。

是否有充分的理由 使用静态方法,而是使用Manager类?


阅读 185

收藏
2021-01-20

共1个答案

一尘不染

将自定义查询添加到管理器是Django约定。来自自定义管理器的Django文档:

添加额外的Manager方法是向模型添加“表级”功能的首选方法。

如果是您自己的私人应用程序,那么约定用词并不重要-实际上,我公司的内部代码库具有一些可能属于自定义管理器的类方法。

但是,如果您要编写要与其他Django用户共享的应用程序,那么他们将期望findBy在自定义管理器上看到该应用程序。

我认为您提到的继承问题不是太糟糕。如果您阅读了自定义管理器和模型继承文档,我认为您不会陷入困境。写作的冗长性.objects是可以忍受的,就像我们使用XYZ.objects.get()和进行查询时一样XYZ.objects.all()

我认为使用管理器方法有以下几个优点:

  1. API的一致性。你的方法findBy属于有getfilteraggregate和休息。想知道您可以在XYZ.objects管理器上执行哪些查询吗?您可以内省时很简单dir(XYZ.objects)

  2. 静态方法使实例名称空间“混乱”。XYZ.findBy()很好,但是如果您定义静态方法,也可以这样做xyz.findBy()findBy在特定实例上运行查找实际上没有任何意义。

  3. 干燥。有时,您可以在多个模型上使用同一管理器。

说了这么多,这取决于您。我不知道为什么不应该使用静态方法的致命原因。您是成年人,这是您的代码,如果您不想以findBy管理者的方式编写代码,那么天空不会掉下来;)

为了进一步阅读,我推荐Django发布经理James
Bennett的博客文章Managers与类方法

2021-01-20