如何在Django中以编程方式获取模型的管理器实例

时间:2016-02-12 09:24:15

标签: python django django-models django-managers

我有一个自定义管理器添加到模型中:

class StandardManagerModel(models.Model):
    pass

class PublishableManager(models.Manager):
    pass

class Publishable(models.Model):
    published_objects = PublishableManager()

这将从模型中删除默认的.objects管理器。如何检索模型类中声明的默认管理器?我想要一个像get_default_manager()

这样的函数
manager = get_default_manager(Publishable)
assert manager is Publishable.published_objects

manager = get_default_manager(StandardManagerModel)
assert manager is StandardManagerModel.objects

2 个答案:

答案 0 :(得分:2)

看起来你根本不需要任何功能。它作为属性存储在模型中:

Model._default_manager

还有Model._base_manager,我只能假设,如果你不提供默认管理员,那就是默认管理员。

答案 1 :(得分:0)

来自docs

  

如果您使用自定义管理器对象,请注意第一个管理器Django遇到(按照它们在模型中定义的顺序)具有特殊状态。 Django将类中定义的第一个Manager解释为“默认”管理器,Django的几个部分(包括dumpdata)将专门为该模型使用该Manager。因此,在选择默认管理器时要小心谨慎,以避免重写get_queryset()导致无法检索您想要使用的对象。

您也可以提供默认管理器

objects = models.Manager()
published_objects = PublishableManager()