Как программно получить экземпляр менеджера для модели в Django

У меня есть собственный менеджер, добавленный в модель следующим образом:

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

person Mariusz Jamro    schedule 12.02.2016    source источник
comment
Чаще всего, если вы хотите это сделать, вы сохраните полиморфную модель, заменив объекты… class Publishable(models.Model): \n published_objects = PublishableManager()\n objects = published_objects   -  person christophe31    schedule 12.02.2016


Ответы (2)


Похоже, вам вообще не нужна функция. Он хранится как атрибут модели:

Model._default_manager

Есть также Model._base_manager, который, я могу только предположить, является менеджером по умолчанию, если вы его не предоставите.

person radicalbiscuit    schedule 20.09.2016

Из документов.

Если вы используете пользовательские объекты Manager, обратите внимание, что первый менеджер, с которым Django сталкивается (в порядке, в котором они определены в модели), имеет особый статус. Django интерпретирует первый менеджер, определенный в классе, как менеджер «по умолчанию», и некоторые части Django (включая данные дампа) будут использовать этот менеджер исключительно для этой модели. В результате рекомендуется быть осторожным при выборе менеджера по умолчанию, чтобы избежать ситуации, когда переопределение get_queryset() приводит к невозможности получения объектов, с которыми вы хотели бы работать.

Вы также можете указать менеджера по умолчанию

objects = models.Manager()
published_objects = PublishableManager()
person Sayse    schedule 12.02.2016