2011-10-07 45 views
23

读完Django Managers后,我仍然不确定使用它会带来多大的好处。看起来最好的用法是添加自定义查询(只读)方法,如XYZ.objects.findBy*()。但我可以很容易地用Model类本身的静态方法来做到这一点。直接在Model类上使用Django Managers和staticmethod

我更喜欢后者总是因为:在可读性和容易维护方面

  1. 代码位置
  2. 略少冗长,因为我不需要在我的电话的objects财产
  3. Manager类有有关模型继承的奇怪规则,可能还要保持清楚。

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

回答

28

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

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

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

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

我不认为你提到的继承问题太糟糕了。如果您阅读custom managers and model inheritance docs,我不认为你会被抓到。写作.objects的冗长是可以忍受的,只是因为它是当我们使用XYZ.objects.get()XYZ.objects.all()

下面是一个使用在我看来manager方法的一些优势做查询:

  1. 一致性的API。您的方法findBy属于get,filter,aggregate等。想知道您可以在XYZ.objects管理器上执行哪些查找?当你可以用dir(XYZ.objects)进行反思时,这很简单。

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

  3. 干燥。有时你可以在多个模型上使用同一个经理。

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

为进一步阅读,我建议博客文章Managers versus class methods由Django发布经理James Bennett撰写。

+4

非常感谢alasdir,您的解释很有道理,您添加的链接非常有帮助! – Xerion