Django: especifique qué administrador de modelos debe usar el administrador de Django

He creado un Administrador personalizado para un modelo de Django que devuelve un QuerySet que contiene un subconjunto de objects.all (). Necesito que este sea el Administrador predeterminado del modelo, ya que también estoy creando una etiqueta personalizada que recuperará el contenido de cualquier modelo (especificado por un argumento), y debo usar el Administrador predeterminado para el modelo especificado. Todo eso funciona bien, excepto que: Django Admin TAMBIÉN usa el Administrador predeterminado para este modelo en particular, lo que significa que no todas las instancias del modelo aparecen en el administrador.

Los documentos de Django no ayudan:

Si usa objetos de Administrador personalizados, tenga en cuenta que el primer Administrador de Django (en el orden en que están definidos en el modelo) tiene un estado especial. Django interpreta este primer Administrador definido en una clase como el Administrador “predeterminado”, y varias partes de Django ( aunque no la aplicación de administración ) usarán ese Administrador exclusivamente para ese modelo. (Documentación Django Managers)

No se supone que el administrador use el Administrador predeterminado, pero parece ser que en mi caso. Tenga en cuenta que también he agregado explícitamente los objects administrador predeterminados:

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

¿Cómo puedo especificar qué administrador debe usar el administrador?

Puede elegir el administrador anulando el método queryset en su subclase 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 

Código actualizado:

 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 puede ser reemplazado …

Como esperamos que los objects sean el único administrador, el administrador usará el manager en self.Admin.manager .

Desde el ticket https://code.djangoproject.com/ticket/4754 abierto por 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() 

Probado con Django 1.11