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

时间:2011-10-07 20:20:49

标签: python django

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

我更喜欢后者,因为:

  1. 代码位置的可读性和易于维护
  2. 稍微不那么详细,因为我在通话中不需要objects属性
  3. Manager类有关于模型继承的奇怪规则,也可以保持清醒。
  4. 是否有充分的理由使用静态方法而不是使用Manager类?

1 个答案:

答案 0 :(得分:32)

向管理员添加自定义查询是Django约定。来自custom managers上的Django文档:

  

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

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

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

我不认为你提到的继承问题太糟糕了。如果您阅读custom managers and model inheritance docs,我认为您不会被发现。写作.objects的详细程度是可以忍受的,就像我们使用XYZ.objects.get()XYZ.objects.all()进行查询时一样

在我看来,使用经理方法的一些优点是:

  1. API的一致性。您的方法findBy属于getfilteraggregate以及其他方法。想知道您可以在XYZ.objects经理上执行哪些查找?当您可以使用dir(XYZ.objects)进行内省时,这很简单。

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

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

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

    如需进一步阅读,我推荐Django发布经理James Bennett撰写的博文Managers versus class methods