【问题标题】:Using Django Managers vs. staticmethod on Model class directly直接在模型类上使用 Django 管理器与静态方法
【发布时间】:2011-10-07 20:20:48
【问题描述】:

在阅读了 Django Managers 之后,我仍然不确定使用它可以获得多少好处。似乎最好的用途是添加自定义查询(只读)方法,如XYZ.objects.findBy*()。但是我可以使用 Model 类本身的静态方法轻松地做到这一点。

我更喜欢后者,因为:

  1. 代码在可读性和易于维护方面的局部性
  2. 略显冗长,因为我的调用中不需要 objects 属性
  3. Manager 类有关于模型继承的奇怪规则,最好不要这样做。

有什么好的理由使用静态方法而是使用管理器类?

【问题讨论】:

    标签: python django


    【解决方案1】:

    向管理器添加自定义查询是 Django 约定。来自custom managers 上的 Django 文档:

    添加额外的 Manager 方法是向模型添加“表级”功能的首选方式。

    如果它是您自己的私有应用程序,那么约定词并不重要 - 事实上,我公司的内部代码库有一些可能属于自定义管理器的类方法。

    但是,如果您正在编写一个要与其他 Django 用户共享的应用程序,那么他们会希望在自定义管理器上看到 findBy

    我不认为你提到的继承问题太糟糕了。如果您阅读custom managers and model inheritance docs,我认为您不会被抓住。写.objects 的冗长是可以忍受的,就像我们使用XYZ.objects.get()XYZ.objects.all() 进行查询时一样

    以下是我认为使用管理器方法的一些优点:

    1. API 的一致性。您的方法findBy 属于getfilteraggregate 和其他方法。想知道您可以在 XYZ.objects 管理器上进行哪些查找?当您可以使用dir(XYZ.objects) 进行自省时,这很简单。

    2. 静态方法“混乱”了实例命名空间。 XYZ.findBy() 很好,但如果你定义一个静态方法,你也可以做xyz.findBy()。在特定实例上运行 findBy 查找实际上没有任何意义。

    3. 干燥度。有时您可以在多个模型上使用同一个管理器。

    说了这么多,就看你自己了。我不知道为什么您不应该使用静态方法的杀手级原因。你是个成年人,这是你的代码,如果你不想写findBy作为管理器方法,天就不会塌下来;)

    为了进一步阅读,我推荐 Django 发布经理 James Bennett 的博文 Managers versus class methods

    【讨论】:

    • 我想知道是否有人可以详细说明为什么模型管理器更适合模型初始化?我“明白”有一个额外的方法,但只是为了建设它似乎被夸大了......
    • @GreenAsJade 用于模型初始化,将方法放在管理器上与现有的XYZ.objects.create() 方法一致。我认为我上面的第 2 点和第 3 点仍然适用。话虽如此,你已经是成年人了。如果您想将您的初始化方法放在模型上,那么如果它适合您/您的团队,那就去吧。
    • LOL 我认为这是因为我是一个成年人,我正在研究其他成年人认为最有效的方法 ;)
    猜你喜欢
    • 2017-07-23
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多