这是我的模特:
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);
。如何在模型中获取相关信息?
感谢您的帮助!
答案 0 :(得分:0)
您已将此声明为classmethod,而不是普通的实例方法。因此,您命名为self
的第一个参数实际上是类,而不是它的实例;而且这个类本身没有任何相关的对象。
这没有理由成为一种课堂方法;删除那个装饰。
答案 1 :(得分:0)
首先,您应修复can_view
方法,使其不是类方法,删除@classmethod
如果您尝试过滤用户,则行self.permissions.filter(permissions = user)
可能无法正常工作。 filter()
方法需要一个关键字参数列表,其中模型字段名称作为键,而您要过滤的值作为井值。您在此处过滤了自己的用户模型,因此您可能希望对id
(或pk
),email
,username
或其他一些独特字段等字段进行过滤。给
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)
这里有一些问题:
正如其他人提到的那样,self
和@classmethod
并不在一起。 self
引用实例,因此它就是方法。
您的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')