Пользовательский диспетчер для фильтрации объектов на сайте, но не в админке?

Я последовал этому примеру , и он отлично работает, но мне интересно, могу ли я сделать исключение, чтобы, когда я нахожусь в админке, все появляются объекты (активные и неактивные). Это может быть просто, но я не могу найти, как это сделать в документации.

Вот как сейчас выглядит мой менеджер:

class ShareManager(models.Manager):
    def get_query_set(self):
        return super(ShareManager, self).get_query_set().filter(active=True)
8
задан Davor Lucic 16 August 2010 в 14:22
поделиться

1 ответ

Есть несколько решений, которые приходят на ум:

  1. определить, какой кверисет использовать для списка изменений с помощью ModelAdmin.queryset().

  2. установите 2 менеджера на вашу модель, первый, который найдет администратор, будет использоваться по умолчанию AFAIK.

    class SomeThing(models.Model):
     objects = models.Manager()
     shares = ShareManager()
    
  3. добавьте новый метод в ваш пользовательский менеджер, который возвращает только активные объекты, а get_query_set оставьте по умолчанию.

    class ShareManager(models.Manager):
     def get_active_items(self):
     return self.get_query_set().filter(active=True)
    

Последующие действия

Я думаю, что наиболее подходящим решением в вашем случае будет сочетание #1 и вариации #2.

Установите ваш пользовательский менеджер как objects, чтобы каждый мог получить к нему доступ (я думаю, это должно сработать для вашей проблемы повторного использования), а также установите менеджер по умолчанию на вашу модель и используйте его в ModelAdmin.queryset().

    class SomeThing(models.Model):
       objects = ShareManager()
       admin_objects = models.Manager()

Я должен был включить пример метода ModelAdmin.queryset(), так что вот он.

    def queryset(self, request):
        qs = self.model.admin_objects.get_query_set()
        # TODO: this should be handled by some parameter to the ChangeList.
        # otherwise we might try to *None, which is bad ;)
        ordering = self.ordering or () 
        if ordering:
            qs = qs.order_by(*ordering)
        return qs

Обратите внимание, что строка qs = self.model.admin_objects.get_query_set() работает с admin_objects , который является экземпляром простого менеджера и включает неопубликованные объекты.

Остальная реализация метода queryset - это реализация Django по умолчанию, которая обычно вызывает qs = self.model._default_manager.get_query_set().

Надеюсь, это немного прояснит ситуацию.

9
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: