Django:复杂的过滤参数还是......?

时间:2010-04-12 09:17:26

标签: django django-admin django-queryset

这个问题与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错误;显示正常的管理页面,而不是列表中有“数据库错误”)

1 个答案:

答案 0 :(得分:3)

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

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