【问题标题】:Django generic relations practiceDjango泛型关系实践
【发布时间】:2011-01-17 13:12:58
【问题描述】:

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

【问题讨论】:

    标签: python django django-orm generic-relationship


    【解决方案1】:

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

    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)    
    

    【讨论】:

    • 这就是我想要的。谢谢!
    猜你喜欢
    • 2014-07-05
    • 2011-09-29
    • 2012-03-20
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多