Я последовал этому примеру , и он отлично работает, но мне интересно, могу ли я сделать исключение, чтобы, когда я нахожусь в админке, все появляются объекты (активные и неактивные). Это может быть просто, но я не могу найти, как это сделать в документации.
Вот как сейчас выглядит мой менеджер:
class ShareManager(models.Manager):
def get_query_set(self):
return super(ShareManager, self).get_query_set().filter(active=True)
Есть несколько решений, которые приходят на ум:
определить, какой кверисет использовать для списка изменений с помощью ModelAdmin.queryset().
установите 2 менеджера на вашу модель, первый, который найдет администратор, будет использоваться по умолчанию AFAIK.
class SomeThing(models.Model):
objects = models.Manager()
shares = ShareManager()
добавьте новый метод в ваш пользовательский менеджер, который возвращает только активные объекты, а 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()
.
Надеюсь, это немного прояснит ситуацию.