在阅读了Django Managers之后,我仍然不确定使用它会带来多少好处。似乎最好的用法是添加自定义查询(只读)方法,如XYZ.objects.findBy*()
。但我可以通过Model
类本身的静态方法轻松实现这一点。
我更喜欢后者,因为:
objects
属性Manager
类有关于模型继承的奇怪规则,也可以保持清醒。是否有充分的理由使用静态方法而不是使用Manager类?
答案 0 :(得分:32)
向管理员添加自定义查询是Django约定。来自custom managers上的Django文档:
添加额外的Manager方法是向模型添加“表级”功能的首选方法。
如果它是你自己的私有应用程序,那么常规词并不重要 - 事实上我公司的内部代码库有一些类别方法可能属于自定义管理器。
但是,如果您正在编写一个您要与其他Django用户共享的应用,那么他们希望在自定义管理器上看到findBy
。
我不认为你提到的继承问题太糟糕了。如果您阅读custom managers and model inheritance docs,我认为您不会被发现。写作.objects
的详细程度是可以忍受的,就像我们使用XYZ.objects.get()
和XYZ.objects.all()
进行查询时一样
在我看来,使用经理方法的一些优点是:
API的一致性。您的方法findBy
属于get
,filter
,aggregate
以及其他方法。想知道您可以在XYZ.objects
经理上执行哪些查找?当您可以使用dir(XYZ.objects)
进行内省时,这很简单。
静态方法“混乱”实例名称空间。 XYZ.findBy()
很好但是如果你定义一个静态方法,你也可以xyz.findBy()
。在特定实例上运行findBy
查找并没有多大意义。
干。有时您可以在多个模型上使用相同的经理。
说了这么多,这取决于你。我不知道为什么你不应该使用静态方法的一个致命的原因。你是一个成年人,这是你的代码,如果你不想写findBy
作为经理方法,天空不会落入;)
如需进一步阅读,我推荐Django发布经理James Bennett撰写的博文Managers versus class methods。