Django - 过滤模型中的相关对象。 'ReverseManyRelatedObjectsDescriptor'对象没有属性'filter'

时间:2016-06-07 20:28:13

标签: django

这是我的模特:

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

我正在创建一个返回True或False的方法,检查某个用户是否可以查看某一行:

@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);。如何在模型中获取相关信息?

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您已将此声明为classmethod,而不是普通的实例方法。因此,您命名为self的第一个参数实际上是类,而不是它的实例;而且这个类本身没有任何相关的对象。

这没有理由成为一种课堂方法;删除那个装饰。

答案 1 :(得分: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()

答案 2 :(得分:0)

这里有一些问题:

  1. 正如其他人提到的那样,self@classmethod并不在一起。 self引用实例,因此它就是方法。

  2. 您的ORM查询也不正确,因为permissions是ManyToMany字段,您需要相应地访问它。

  3. 试试这个方法:

    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')