2012-03-15 185 views
0

我試圖通過內ItemAdmin覆蓋django ManyToManyField的Queryset過濾器?

def queryset(self, request): 

限制的結果。

我想僅顯示通過用戶配置文件被授予了request.user的類別訪問權限的項目。

class Profile(models.Model): 
    user = models.ForeignKey(auth.User, unique=True) 
    categoryAccess = models.ManyToManyField(Category ...) 

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

我不能完全得到語法正確的....我試圖像

class ItemAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(ItemAdmin, self).queryset(request) 
     return qs.filter(category__in=request.user.objects__profile__categoryAccess) 

任何想法的東西呢?非常感謝!

回答

2

過濾器中的雙下劃線語法僅用於表達式的左側(這是一個駭人聽聞的事實,即它實際上是函數的關鍵字參數,而這些參數不能是表達式) 。右手邊用正常的語法來遍歷對象:.所以你可能會這樣:

return qs.filter(category__in=request.user.profile.categoryAccess.all()) 

注意,爲了使這項工作,你應該你user ForeignKey的轉換爲OneToOneField(你不應該需要遷移數據庫,只需更改模型定義)。

+0

嘿丹尼爾!非常感謝...我將該字段更改爲OneToOne,但我得到'配置文件匹配查詢不存在'。 – cssndrx 2012-03-15 02:54:52

+0

哦,哎呀!實際上這是我的不好。代碼打破了,因爲用戶在創建時沒有配置文件。只是捕獲該異常並返回空列表是否正確?感謝修復:) – cssndrx 2012-03-15 03:01:46

+1

只是爲了確認...向後關係user.profile將工作,對吧?我在文檔中看到,與__語法可能存在後向關係。但是,當我創建一個配置文件,然後嘗試過濾:我得到一個非傳統的Django錯誤。它說:「數據庫錯誤:數據庫安裝有問題,確保已經創建了適當的數據庫表,並確保數據庫可以被適當的用戶讀取。」有沒有人見過這個? – cssndrx 2012-03-15 15:44:38

相關問題