Python 直接在模型类上使用Django管理器与staticmethod
在阅读了Django的管理者之后,我仍然不确定使用它会给我带来多少好处。似乎最好的用法是添加自定义查询(只读)方法,如Python 直接在模型类上使用Django管理器与staticmethod,python,django,Python,Django,在阅读了Django的管理者之后,我仍然不确定使用它会给我带来多少好处。似乎最好的用法是添加自定义查询(只读)方法,如XYZ.objects.findBy*()。但是我可以很容易地使用模型类本身之外的静态方法来实现这一点 我总是喜欢后者,因为: 代码的可读性和易于维护方面的局部性 稍微不那么冗长,因为我在调用中不需要对象属性 Manager类在模型继承方面有一些奇怪的规则,最好不要去管它 有什么好的理由不使用静态方法而使用管理器类吗?向管理器添加自定义查询是Django惯例。从Django文档中
XYZ.objects.findBy*()
。但是我可以很容易地使用模型
类本身之外的静态方法来实现这一点
我总是喜欢后者,因为:
对象
属性Manager
类在模型继承方面有一些奇怪的规则,最好不要去管它有什么好的理由不使用静态方法而使用管理器类吗?向管理器添加自定义查询是Django惯例。从Django文档中: 添加额外的管理器方法是向模型添加“表级”功能的首选方法 如果它是你自己的私人应用程序,那么惯例这个词就没那么重要了——事实上,我公司的内部代码库中有一些类方法,它们可能属于定制管理器 但是,如果您正在编写一个应用程序,并且要与其他Django用户共享,那么他们会期望在自定义管理器上看到
findBy
我不认为你提到的继承问题太糟糕。如果你读了这本书,我想你不会被发现的。编写.objects
的冗长是可以忍受的,就像我们使用XYZ.objects.get()
和XYZ.objects.all()进行查询一样
在我看来,使用manager方法有几个优点:
API的一致性。您的方法findBy
属于get
、filter
、aggregate
以及其他方法。想知道可以在XYZ.objects
管理器上执行哪些查找吗?使用dir(XYZ.objects)
进行内省非常简单
静态方法使实例名称空间“混乱”XYZ.findBy()
可以,但如果定义了静态方法,也可以执行XYZ.findBy()
。在特定实例上运行findBy
查找实际上没有意义
干燥。有时,您可以在多个模型上使用同一管理器
说了这么多,就看你了。我不知道为什么不应该使用静态方法。你是一个成年人,这是你的代码,如果你不想写findBy
作为一种管理方法,天空不会塌下来;)
为了进一步阅读,我推荐Django发行经理James Bennett的博文