Django - specify which model manager Django admin should use

前端 未结 3 1921
温柔的废话
温柔的废话 2020-12-04 23:47

I\'ve created a custom Manager for a Django model which returns a QuerySet holding a subset of objects.all(). I need this to be the model\'s default Manager, since I am also

相关标签:
3条回答
  • 2020-12-05 00:25

    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
    
    0 讨论(0)
  • 2020-12-05 00:32

    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

    0 讨论(0)
  • 2020-12-05 00:38

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

    0 讨论(0)
提交回复
热议问题