【问题标题】:Django: Easily add extra manager for child class, still use default manager from AbstractBaseDjango:轻松为子类添加额外的管理器,仍然使用 AbstractBase 的默认管理器
【发布时间】:2009-07-27 15:37:16
【问题描述】:

这个问题是关于Custom managers and model inheritance的最后一个例子。

我希望能够做类似以下的事情:

class ExtraManagerModel(models.Model):
# OtherManager class supplied by argument shall be set as manager here

    class Meta:
        abstract = True

class ChildC(AbstractBase, ExtraManagerModel(OtherManager)): # That doesn't work, something like that
    ...
    # Default manager is CustomManager, but OtherManager is
    # also available via the "extra_manager" attribute.

这样做的全部目的是我不想为每个被覆盖的管理器编写一个ExtraManagerModel 类,以保留父类的默认管理器 (AbstractBase)。

有什么想法可以实现吗?

【问题讨论】:

  • 我不清楚你想做什么。来自 django 网站的示例中的 ChildC 似乎可以满足您的需求。两个管理器都可用于类,继承中 ExtraManagerModel 的“参数”是什么?
  • 为每个要添加到模型的额外管理器编写一个新的模型类并不是很干。我想为不同的额外管理器类提供一种 ExtraManagerModel 模板类。

标签: python django django-models


【解决方案1】:

我完全不确定我是否理解您的问题。您的代码 sn-p 似乎与它下面的注释相矛盾。

您的代码 sn-p 看起来您希望能够拥有不同的 ExtraManagerModel 类。如果是这种情况,您可以使用由这些 ExtraManagerModel 实现的抽象类,并为 childC 类继承这些类的抽象父类。

希望这会有所帮助。

【讨论】:

  • 我现在明白了,这是一个奇怪的问题,因为它最终并没有做它想要的。我最好在任何其他管理器之前在模型中重新声明假定的默认管理器。
  • 对于任何了解我的问题并正在寻找解决方案的人:我最终使用了类工厂:在其中声明自定义类并返回它们的函数。
猜你喜欢
  • 2019-08-17
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多