有没有办法过滤django管理员中的查询集?

时间:2009-10-30 21:02:09

标签: django django-admin

我正在尝试为模型栏定义一个动作 - 但我只想要与用户Foo相关的Bar对象列表。

在我开始在管理代码中乱码并传入自定义查询集(或编写一个劫持管理员的多重复选框支持的自定义视图)之前,我想我会检查是否有某种方法可以切片按原样上传数据,我得到一个列表视图。

注意:我不是要尝试按相关用户排序,而我不是要尝试在默认列表视图中添加额外选项以按用户进行过滤;我需要一个特定的URL或视图,它将 一个Bar对象列表提供给特定的用户Foo。

2 个答案:

答案 0 :(得分:25)

没有记录,但标准的changelist视图接受普通的queryset过滤器参数作为GET参数。所以你可以这样做:

/admin/myapp/bar/?user__username=foo

答案 1 :(得分:25)

如果您使用的是1.1.x,那么传递自定义查询集实际上非常容易。您需要做的就是覆盖ModelAdmin上的queryset()方法。像这样:

class ThisAdmin(admin.ModelAdmin):
    def queryset(self, request):
        """
        Filter the objects displayed in the change_list to only
        display those for the currently signed in user.
        """
        qs = super(ThisAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(owner=request.user)

这实际上也可以在1.0.x分支中完成,但在ModelAdmin中需要更多的额外代码。

这种方法的优点在于它不会使您漂亮的漂亮管理URL混乱(因此,对您的用户来说,如何查看其他人对象非常明显)。