【发布时间】:2010-12-05 10:17:30
【问题描述】:
我为 Django 模型创建了一个自定义管理器,它返回一个包含 objects.all() 子集的 QuerySet。我需要它作为模型的默认管理器,因为我还创建了一个自定义标签,它将从任何模型(由参数指定)中检索内容,并且需要对指定模型使用默认管理器。一切正常,除了 - Django Admin 也使用此特定模型的默认管理器,这意味着并非所有模型实例都出现在 admin 中。
Django 文档没有帮助:
如果您使用自定义 Manager 对象,请注意 Django 遇到的第一个 Manager 对象(在 它们在模型中定义的顺序)具有特殊状态。 Django 将类中定义的第一个 Manager 解释为“默认”Manager,并且 Django 的几个部分(虽然不是管理应用程序)将专门为该模型使用该 Manager。 (Django Managers documentation)
管理员不应该使用默认管理器,但在我看来似乎是这样。请注意,我还明确添加了默认管理器objects:
subset = CustomManager() # the default manager
objects = models.Manager() # the one I want admin to use
如何指定管理员应该使用哪个 Manager?
【问题讨论】:
-
我也被您在管理文档中突出显示的部分绊倒了。这是我发现 django 文档模棱两可的少数几次之一。
-
奇怪。查看最新的 Django 源代码,管理员似乎确实使用了默认管理器。
-
@Michael 管理员至少从 Django 1.0 开始就使用默认管理器。这里的问题更多是文档错误,已修复 github.com/django/django/commit/…
-
@ChrisLawlor 好点。感谢您的参考:)
-
@Alasdair “这是我发现 django 文档模棱两可的几次 [原文如此] 之一。”哈哈。