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


Creé 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 necesita usar el administrador predeterminado para el modelo especificado. Todo eso funciona bien, excepto que Django Admin TAMBIÉN está utilizando 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 personalizados de Administrador, tenga en cuenta que el primer Administrador de Django se encuentra (en   el orden en el que están definidos en el modelo) tiene un estado especial. Django interpreta este primer Manager definido en una clase como el Administrador "predeterminado" y varias partes de Django (aunque no es la aplicación de administración) usará ese Manager exclusivamente para ese modelo.    (Documentación de Django Managers)

Se supone que el administrador no debe usar el administrador predeterminado, pero parece estar en mi caso. Tenga en cuenta que también he agregado explícitamente el administrador predeterminado objects:

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

¿Cómo puedo especificar qué administrador debería usar el administrador?


32
2017-10-09 17:20


origen


Respuestas:


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

41
2017-10-09 18:23



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 ...


6
2018-06-21 10:56



Como esperamos objects para ser el único administrador, el administrador usará manager en self.Admin.manager.

Del boleto 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


0
2018-06-21 10:49