2016-06-07 470 views
0

這是我的模型:Django - 模型中的過濾器相關對象。 「ReverseManyRelatedObjectsDescriptor」對象有沒有屬性「過濾器」

class Delivery(models.Model): 
    name = models.CharField(_(u"Name"), max_length=50) 
    permissions = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True) 

我創建一個方法返回真或假牛逼檢查,如果某用戶可以查看某行:

@classmethod 
def can_view(self, user):   
    permission = self.permissions.filter(permissions = user);   
    return permission is not None; 

,並試圖用這個方法我得到這個錯誤時:'ReverseManyRelatedObjectsDescriptor' object has no attribute 'filter'

正如你所看到的,我不知道我可以檢查用戶是否有權限:permission = self.permissions.filter(permissions = user);。我如何獲得模型中的相關內容?

感謝您的幫助!

+0

你不能有一個類方法,並期望'self'工作; 'self'就是例如方法。 –

回答

0

你已經聲明這是一個classmethod,而不是一個普通的實例方法。因此,您命名爲self的第一個參數實際上是類,而不是它的一個實例;而這個類本身沒有任何相關的對象。

有沒有理由這是一個classmethod;刪除那個裝飾器。

+0

感謝您的回答!不幸的是它沒有工作,權限仍然是空的 –

0

首先應該解決您的can_view方法,所以它不是一個類的方法,去除@classmethod

self.permissions.filter(permissions = user)如果你想對用戶篩選器可能不會工作。 filter()方法需要一個關鍵字參數列表,其中模型字段名稱作爲關鍵字,並且您將過濾的值作爲值,值。在這裏,您正在過濾您的用戶模型,因此您可能需要過濾像id(或pk),emailusername或其他某個唯一字段的字段。給 docs for .filter(**kwargs)一個閱讀。我想推薦使用return self.permissions.filter(pk=user.pk).exists()。我正在過濾pk,因爲這很簡單,並且保證可以正常工作。

def can_view(self, user): 
    return self.permissions.filter(pk=user.pk).exists() 
0

你這裏有幾個問題:

  1. 正如其他人所提到的,self@classmethod不要一起去。 self指的是實例,所以它的方法。

  2. 您的ORM查詢也不正確,因爲permissions是ManyToMany字段,因此您需要相應地訪問它。

試試這個方法:

def can_view(self, user): 
    return self.permissions.filter(pk=user.pk).exists() 

不過,你真的不需要此方法,因爲所有User對象將有一個delivery_set模型(見docs),所以你可以簡單地做:

def check_if_delivery_belongs_to_user(request, delivery_pk=None): 
    delivery = get_object_or_404(Delivery, pk=delivery_pk) 
    if request.user.delivery_set.filter(pk=delivery.pk).exists(): 
     print('You can access this') 
    else: 
     print('Nope, you cannot')