Переопределить набор запросов по умолчанию в Django admin
одна из моих моделей имеет удаленный флаг, который используется для скрытия объектов глобально:
class NondeletedManager(models.Manager):
"""Returns only objects which haven't been deleted"""
def get_query_set(self):
return super(NondeletedManager, self).get_query_set().exclude(deleted=True)
class Conversation(BaseModel):
...
deleted = models.BooleanField(default=False)
objects = NondeletedManager()
all_conversations = models.Manager() # includes deleted conversations
Как я могу переопределить набор запросов по умолчанию, используемый модулем администрирования Django для включения удаленных разговоров?
4 ответа:
вы можете переопределить
get_queryset
метод в вашей модели класса администратора.class MyModelAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super(MyModelAdmin, self).get_queryset(request) if request.user.is_superuser: return qs return qs.filter(author=request.user)
Примечание в Djangoqueryset.
Конрад прав, но это сложнее, чем пример, приведенный в документации.
удаленные разговоры не могут быть включены в набор запросов, который уже исключает их. Поэтому я не вижу другого варианта, кроме повторного внедрения admin.ModelAdmin.queryset полностью.
class ConversationAdmin (admin.ModelAdmin): def queryset (self, request): qs = Conversation.all_conversations ordering = self.get_ordering(request) if ordering: qs = qs.order_by(*ordering) return qs
что было бы так неправильно со следующим:
class Conversation(BaseModel): ... deleted = models.BooleanField(default=False) objects = models.Manager() # includes deleted conversations nondeleted_conversations = NondeletedManager()
Итак, в ваших собственных приложениях / проектах вы используете
Conversation.nondeleted_conversations()
и пусть встроенный администратор приложение сделать это вещь.
принятое решение отлично работает для меня, но мне нужно было немного больше гибкости, поэтому я в конечном итоге расширил представление списка изменений, чтобы добавить в пользовательский параметр queryset. Теперь я могу настроить свой стандартный queryset / filter как таковой, и он все еще может быть изменен с помощью другого фильтра (получить параметры):
def changelist_view(self, request, extra_context=None): if len(request.GET) == 0 : q = request.GET.copy() q['status__gt'] = 4 request.GET = q request.META['QUERY_STRING'] = request.GET.urlencode() return super(WorksheetAdmin,self).changelist_view(request, extra_context=extra_context)