2016-06-07 60 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')