[Django]-Django – specify which model manager Django admin should use

64👍

✅

You can choose the manager by overriding the queryset method in your ModelAdmin subclass.

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

12👍

Updated code:

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 can be replaced…

5👍

The order in which you define your managers matters. Admin takes the first manager defined on the model.

So if you do like this:

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

the default manager will be subset

and if you do like this:

objects = models.Manager() # the default manager
subset = CustomManager() # your own manager

then the default manager will be objects.

1👍

As we expect objects to be the sole manager, the admin will use manager in self.Admin.manager.

From the ticket https://code.djangoproject.com/ticket/4754 opened by 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()

Tested with Django 1.11

Leave a comment