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
Как я могу указать, какой менеджер должен использовать администратор?
Ответы
Ответ 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