Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 直接在模型类上使用Django管理器与staticmethod_Python_Django - Fatal编程技术网

Python 直接在模型类上使用Django管理器与staticmethod

Python 直接在模型类上使用Django管理器与staticmethod,python,django,Python,Django,在阅读了Django的管理者之后,我仍然不确定使用它会给我带来多少好处。似乎最好的用法是添加自定义查询(只读)方法,如XYZ.objects.findBy*()。但是我可以很容易地使用模型类本身之外的静态方法来实现这一点 我总是喜欢后者,因为: 代码的可读性和易于维护方面的局部性 稍微不那么冗长,因为我在调用中不需要对象属性 Manager类在模型继承方面有一些奇怪的规则,最好不要去管它 有什么好的理由不使用静态方法而使用管理器类吗?向管理器添加自定义查询是Django惯例。从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的博文