2010-04-12 82 views
1

这个问题连接到my other question但我改变了一下逻辑。Django:复杂的过滤器参数或...?

我有机型是这样的:

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的错误数据库错误;正常管理页面显示出来,而是代替列表中有一项 “数据库错误”)

回答

3

您可以尝试使用__in操作:

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

Ohmigod,那就是诀窍!我用这个:qs = qs.filter(category__in = Category.objects.filter(editors__in = request.user.groups.all()))感谢! – minder 2010-04-12 11:29:55