Skip to main content
 首页 » 编程设计

python之Django泛型关系实践

2024年09月03日35zhenyulu

我正在为我的 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? 我正在尝试构建一个通用后端,所以我不希望它依赖于使用它的应用程序。 谢谢!

请您参考如下方法:

我猜你正在寻找类似的东西:

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 Permission 的对象,以及 group 的 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() 

这将使您的 View 代码更简单:

perm = Permission.objects.get(pk=1) # pk #1 for brevity. 
group = Group.objects.get(pk=1)     # Again, for brevity. 
objects = group.permissions.for(perm)