Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете выбрать менеджера, переопределив метод 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

Ответ 2

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

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 можно заменить...

Ответ 3

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

Из билета https://code.djangoproject.com/ticket/4754 открывается troy.simpson

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()

Протестировано с помощью Django 1.11