Django 通用关系实践

2 投票
1 回答
1419 浏览
提问于 2025-04-15 19:21

我正在为我的Django应用开发一个认证后端,目的是实现基于对象的权限管理。我使用了对象和权限之间的通用关系:

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更好?我想构建一个通用的后端,所以不希望它依赖于使用它的应用。谢谢!

1 个回答

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里。

你也可以把这个功能放到一个自定义管理器类里面:

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)    

撰写回答