gpt4 book ai didi

python - 直接在模型类上使用 Django 管理器与静态方法

转载 作者:IT老高 更新时间:2023-10-28 22:22:14 25 4
gpt4 key购买 nike

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

我更喜欢后者,因为:

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

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

最佳答案

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

Adding extra Manager methods is the preferred way to add "table-level" functionality to your models.

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

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

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

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

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

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

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

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

为了进一步阅读,我推荐博客文章 Managers versus class methods由 Django 发布经理 James Bennett 撰写。

关于python - 直接在模型类上使用 Django 管理器与静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7692487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com