覆盖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的pipe理模块使用的默认查询集包括已删除的会话?
您可以覆盖模型admin类中的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)
请注意,在Django <= 1.5中,该方法被命名为queryset
。
康拉德是正确的,但这比文档中给出的例子更难。
删除的会话不能包含在已经排除它们的查询集中。 所以我没有看到除了重新实现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()
,让内置的pipe理应用程序做这件事情。
接受的解决scheme对我很好,但我需要更多的灵活性,所以我最终扩展了更改列表视图以添加自定义的queryset参数。 我现在可以configuration我的默认查询集/filter,它仍然可以通过使用不同的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)