Django - укажите, какой менеджер моделей должен использовать администратор Django - PullRequest
35 голосов
/ 09 октября 2009

Я создал собственный менеджер для модели Django, который возвращает QuerySet, содержащий подмножество objects.all (). Мне нужно, чтобы это был Менеджер по умолчанию для модели, так как я также создаю пользовательский тег, который будет извлекать содержимое из любой модели (указанной аргументом), и должен использовать Менеджер по умолчанию для указанной модели. Все это прекрасно работает, за исключением того, что администратор Django ТАКЖЕ использует менеджер по умолчанию для этой конкретной модели, что означает, что не все экземпляры модели отображаются в администраторе.

Документы Django не помогают:

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

Администратор не должен использовать Менеджер по умолчанию, но, похоже, в моем случае. Обратите внимание, что я также явно добавил менеджер по умолчанию objects:

subset = CustomManager() # the default manager
objects = models.Manager() # the one I want admin to use

Как мне указать, какой менеджер должен использовать администратор?

Ответы [ 3 ]

47 голосов
/ 09 октября 2009

Вы можете выбрать менеджера, переопределив метод queryset в своем подклассе ModelAdmin.

def get_queryset(self, request):
    # use our manager, rather than the default one
    qs = self.model.objects.get_queryset()

    # we need this from the superclass method
    ordering = self.ordering or () # otherwise we might try to *None, which is bad ;)
    if ordering:
        qs = qs.order_by(*ordering)
    return qs
8 голосов
/ 21 июня 2013

Обновленный код:

def get_queryset(self, request):
    """
    Returns a QuerySet of all model instances that can be edited by the
    admin site. This is used by changelist_view.
    """
    qs = self.model._default_manager.get_queryset()
    # TODO: this should be handled by some parameter to the ChangeList.
    ordering = self.get_ordering(request)
    if ordering:
        qs = qs.order_by(*ordering)
    return qs

_default_manager можно заменить ...

1 голос
/ 21 июня 2017

Поскольку мы ожидаем, что objects будет единственным менеджером, администратор будет использовать manager в self.Admin.manager.

Из билета https://code.djangoproject.com/ticket/4754, открытого Трой.Симпсоном

class filterManager(models.Manager):
  def get_query_set(self):
    return super(filterManager, self).get_query_set().filter(name='troy')

class Blah(models.Model):
  name = models.CharField(maxlength=100)
  objects = filterManager()
  class Admin:
    manager = filterManager()

Протестировано с Джанго 1.11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...