在阅读了Django Managers之后,我仍然不确定使用它会带来多少好处。似乎最好的用法是添加自定义查询(只读)方法,例如XYZ.objects.findBy*()。但是我可以使用Model类本身之外的静态方法轻松地做到这一点。
XYZ.objects.findBy*()
Model
我总是更喜欢后者,因为:
objects
Manager
是否有充分的理由 不 使用静态方法,而是使用Manager类?
将自定义查询添加到管理器是Django约定。来自自定义管理器的Django文档:
添加额外的Manager方法是向模型添加“表级”功能的首选方法。
如果是您自己的私人应用程序,那么约定用词并不重要-实际上,我公司的内部代码库具有一些可能属于自定义管理器的类方法。
但是,如果您要编写要与其他Django用户共享的应用程序,那么他们将期望findBy在自定义管理器上看到该应用程序。
findBy
我认为您提到的继承问题不是太糟糕。如果您阅读了自定义管理器和模型继承文档,我认为您不会陷入困境。写作的冗长性.objects是可以忍受的,就像我们使用XYZ.objects.get()和进行查询时一样XYZ.objects.all()
.objects
XYZ.objects.get()
XYZ.objects.all()
我认为使用管理器方法有以下几个优点:
API的一致性。你的方法findBy属于有get,filter,aggregate和休息。想知道您可以在XYZ.objects管理器上执行哪些查询吗?您可以内省时很简单dir(XYZ.objects)。
get
filter
aggregate
XYZ.objects
dir(XYZ.objects)
静态方法使实例名称空间“混乱”。XYZ.findBy()很好,但是如果您定义静态方法,也可以这样做xyz.findBy()。findBy在特定实例上运行查找实际上没有任何意义。
XYZ.findBy()
xyz.findBy()
干燥。有时,您可以在多个模型上使用同一管理器。
说了这么多,这取决于您。我不知道为什么不应该使用静态方法的致命原因。您是成年人,这是您的代码,如果您不想以findBy管理者的方式编写代码,那么天空不会掉下来;)
为了进一步阅读,我推荐Django发布经理James Bennett的博客文章Managers与类方法。