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

and*_*rew 16 django django-admin

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

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

注意:我不是要尝试按相关用户排序,我不是要尝试在默认列表视图中添加额外选项以按用户进行过滤; 我需要一个特定的URL或视图,这将使我只是一个酒吧对象名单向特定用户foo.

Dan*_*man 26

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

/admin/myapp/bar/?user__username=foo
Run Code Online (Sandbox Code Playgroud)


Jos*_*man 25

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

class ThisAdmin(admin.ModelAdmin):
    def get_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).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(owner=request.user)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于所有最新版本的Django,`def queryset`是`def get_queryset`. (5认同)
  • 这适用于在管理员上直接编辑的模型.如何在下拉列表中自动填充外键. (2认同)