2010-04-12 89 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