【问题标题】:Is there a way to filter a queryset in the django admin?有没有办法在 django 管理员中过滤查询集?
【发布时间】:2010-12-11 18:12:43
【问题描述】:

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

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

注意:我没有尝试按相关用户排序,也没有尝试向默认列表视图添加额外选项以按用户过滤;我需要一个特定的 URL 或视图,以便只是为我提供一个 特定 用户 Foo 的 Bar 对象列表。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您需要做的就是覆盖 ModelAdmin 上的 get_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)
    

    这种方法的优点是它不会弄乱您漂亮漂亮的管理 URL(因此,如何让您的用户非常清楚如何查看其他人的对象)。

    【讨论】:

    • 这适用于直接在管理员上编辑的模型。在下拉菜单中自动填充的外键怎么样。
    • 对于所有最新版本的 Django,def querysetdef get_queryset
    【解决方案2】:

    它没有记录,但标准的变更列表视图接受普通的查询集过滤器参数作为 GET 参数。所以你可以这样做:

    /admin/myapp/bar/?user__username=foo
    

    【讨论】:

    猜你喜欢
    • 2016-01-13
    • 2017-02-20
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多