【问题标题】:Django: Complex filter parameters or...?Django:复杂的过滤器参数或......?
【发布时间】:2011-02-06 22:24:34
【问题描述】:

这个问题与my other question有关,但我稍微改变了逻辑。

我有这样的模型:

from django.contrib.auth.models import Group

class Category(models.Model):
   (...)
   editors = ForeignKey(Group)

class Entry(models.Model):
   (...)
   category = ForeignKey(Category)

现在假设用户登录到管理面板并想要更改条目。我如何将条目列表仅限于那些,他有权编辑?我的意思是:如何仅列出分配给“编辑器”字段中具有用户所属组之一的类别的那些条目?

如果用户属于多个组怎么办?我仍然需要显示所有相关条目。

我尝试尝试使用 changelist_view() 和 queryset() 方法,但这个问题对我来说有点太复杂了。

我也想知道granular-permissions 是否可以帮助我完成这项任务,但目前我不知道。

我只是想出了这个:首先我得到了用户所属的所有组的列表。然后对于每个组,我得到所有连接的类别,然后对于每个类别,我得到属于这些类别的所有条目。不幸的是,我不知道如何将所有内容作为 filter() 参数拼接在一起以生成一个不错的单个 QuerySet。

编辑:

我尝试像这样使用MultiQuerySet:

class EntryAdmin(admin.ModelAdmin):

    (...)

    def queryset(self, request):
        qs = super(EntryAdmin, self).queryset(request)
        if not request.user.is_superuser:
            groups = request.user.groups.all()
            list = []
            for group in groups:
                categories = Category.objects.filter(editors=group)
                for category in categories:
                    results = qs.filter(category=category)
                    list.append(results)
            qs = MultiQuerySet(*list)
        return qs

但我在管理视图中收到一个数据库错误(不是 Django 错误;显示的是正常管理页面,但不是列表而是“数据库错误”)

【问题讨论】:

    标签: django django-admin django-queryset


    【解决方案1】:

    您可以尝试使用 __in 运算符:

    qs = Category.objects.filter(editors__in=request.user.groups.all())
    

    【讨论】:

    • 天哪,成功了!我用这个:qs = qs.filter(category__in=Category.objects.filter(editors__in=request.user.groups.all())) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2013-06-03
    • 2022-11-30
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多