在阅读了Django管理者的文章后,我仍然不确定使用它会给我带来多少好处.似乎最好的用法是添加自定义查询(只读)方法,比如XYZ.objects.findBy*()
.但我可以很容易地用Model
个类中的静态方法来实现这一点.
我更喜欢后者,总是因为:
- 代码在可读性和更易于维护方面的局部性
- 稍微不那么冗长,因为我的通话中不需要
objects
属性 -
Manager
个类都有关于模型继承的奇怪规则,最好不要go 管它.
是否有充分的理由使用静态方法,而不是使用管理器类?
在阅读了Django管理者的文章后,我仍然不确定使用它会给我带来多少好处.似乎最好的用法是添加自定义查询(只读)方法,比如XYZ.objects.findBy*()
.但我可以很容易地用Model
个类中的静态方法来实现这一点.
我更喜欢后者,总是因为:
objects
属性Manager
个类都有关于模型继承的奇怪规则,最好不要go 管它.是否有充分的理由使用静态方法,而不是使用管理器类?
向管理器添加自定义查询是Django约定.从custom managers页的Django文档:
添加额外的管理器方法是向模型添加"表级"功能的首选方法.
如果它是您自己的私有应用程序,那么约定这个词并不重要-事实上,我公司的内部代码库有几个类方法,它们可能属于自定义管理器.
但是,如果您编写的应用程序将与其他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.