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

Xer*_*ion 26 python django

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

我更喜欢后者,因为:

  1. 代码局部性在可读性和易于维护方面
  2. 稍微不那么冗长,因为我objects在通话中不需要该属性
  3. Manager 类有关于模型继承的奇怪规则,也可以保持清醒.

有没有什么好的理由使用静态方法而是使用Manager类?

Ala*_*air 33

向管理器添加自定义查询是Django约定.来自自定义管理器的Django文档:

添加额外的Manager方法是向模型添加"表级"功能的首选方法.

如果它是你自己的私有应用程序,那么常规词并不重要 - 事实上我的公司的内部代码库有一些可能属于自定义管理器的类方法.

但是,如果您正在编写一个您要与其他Django用户共享的应用程序,那么他们希望能够findBy在自定义管理器上看到.

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

在我看来,使用管理器方法有一些优点:

  1. API的一致性.你的方法findBy属于有get,filter,aggregate和休息.想知道你可以在XYZ.objects经理上做什么查找?当你可以反省时,它很简单dir(XYZ.objects).

  2. 静态方法"混乱"实例命名空间.XYZ.findBy()很好但是如果你定义一个静态方法,你也可以这样做xyz.findBy().findBy在特定实例上运行查找并没有多大意义.

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

说了这么多,这取决于你.我不知道为什么你不应该使用静态方法的一个致命的原因.你是一个成年人,这是你的代码,如果你不想写findBy一个经理方法,天空就不会落入;)

为了进一步阅读,我推荐Django发布经理James Bennett撰写的关于Managers与class方法的博客文章.