将自定义查询添加到管理器是Django约定。来自Django文档custom managers:
添加额外的Manager方法是向模型添加“表级”功能的首选方式。
如果它是您自己的私人应用程序,那么这个约定词就不重要了 - 事实上,我公司的内部代码库有一些可能属于自定义管理器的类方法。
但是,如果您正在编写将与其他Django用户共享的应用程序,那么他们会在自定义管理器上看到findBy
。
我不认为你提到的继承问题太糟糕了。如果您阅读custom managers and model inheritance docs,我不认为你会被抓到。写作.objects
的冗长是可以忍受的,只是因为它是当我们使用XYZ.objects.get()
和XYZ.objects.all()
下面是一个使用在我看来manager方法的一些优势做查询:
一致性的API。您的方法findBy
属于get
,filter
,aggregate
等。想知道您可以在XYZ.objects
管理器上执行哪些查找?当你可以用dir(XYZ.objects)
进行反思时,这很简单。
静态方法“混乱”实例名称空间。 XYZ.findBy()
很好,但是如果你定义了一个静态方法,你也可以做xyz.findBy()
。在特定实例上运行findBy
查找并不合理。
干燥。有时你可以在多个模型上使用同一个经理。
说了这么多,这取决于你。我不知道为什么你不应该使用静态方法的杀手锏。你是一个成年人,这是你的代码,如果你不想写findBy
作为经理的方法,天空不会落入;)
为进一步阅读,我建议博客文章Managers versus class methods由Django发布经理James Bennett撰写。
非常感谢alasdir,您的解释很有道理,您添加的链接非常有帮助! – Xerion