我正在为我的django-app开发一个基于对象权限的身份验证后端。我使用对象和权限之间的通用关系:
class GroupPermission(models.Model):
content_t= models.ForeignKey(ContentType,related_name='g_content_t')
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_t', 'object_id')
permission=models.ForeignKey(Permission)
group = models.ForeignKey(Group)
现在我希望获得指定内容类型的所有对象,其中某个组或用户具有相应的权限。最好的方法是什么? 我应该在应用程序模型中定义关系的第二个结尾吗?或者更好地编写自定义sql? 我正在尝试构建一个通用的后端,所以我不希望它依赖于使用它的应用程序。 谢谢!
答案 0 :(得分:3)
我猜你正在寻找类似的东西:
perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1) # Again, for brevity.
group_perms = GroupPermission.objects.filter(permission=perm, group=group)
objects = [x.content_object for x in group_perms]
这应该将所有具有perm
权限和group
组的对象放入变量objects
。
您也可以将其实现为Custom Manager类:
class GroupPermissionManager(models.Manager):
def for(self, perm):
group_perms = GroupPermission.objects.filter(permission=perm, group=self)
objects = [x.content_object for x in group_perms]
class Group(models.Model):
name = models.CharField(max_length=30)
permissions = GroupPermissionManager()
这将使您的视图代码更简单:
perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1) # Again, for brevity.
objects = group.permissions.for(perm)