首页 > 解决方案 > Django ORM:使用链接表连接两个表

问题描述

我想has_permission(self, permission_name)在类中集成一个功能Profile。为此,我想做一个返回权限名称列表的 ORM 语句。

数据模型为:

我的models.py样子是这样的:

class ProfileGroup(models.Model):
    name = models.CharField(max_length=64)


class ProfilePermission(models.Model):
    name = models.CharField(max_length=64)


class GroupPermissions(models.Model):
    group = models.ForeignKey(ProfileGroup, on_delete=models.RESTRICT)
    permission = models.ForeignKey(ProfilePermission, on_delete=models.RESTRICT)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['group', 'permission'], name='Unique')
        ]

    def __str__(self):
        return f'Group "{self.group.name}" has permission "{self.permission.name}"'


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    group = models.ForeignKey(ProfileGroup, on_delete=models.RESTRICT)

    def __str__(self):
        return f'Profile of {self.user.username}'

    def has_permission(self, permission_name):
        return True

该函数has_permission(在Profile类中)应检查权限permission是否包含在权限列表中。我试过了

list_of_permissions = GroupPermissions.objects.filter(group=self.group)

但这会返回一个ProfilePermission. 我想要的是权限名称列表(permission.name)。

所以我必须加入两个表GroupPermissionsProfilePermission. 我发现了一些东西prefetch_relatedselect_related但这并不像我想要的那样工作。

标签: djangodjango-orm

解决方案


直接回答你的问题,

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    group = models.ForeignKey(ProfileGroup, on_delete=models.RESTRICT)

    def __str__(self):
        return f'Profile of {self.user.username}'

    def has_permission(self, permission_name):
        return GroupPermissions.objects.filter(group=self.group, permission__name=permission_name).exists()

但是...我对你的建议是不要试图重新发明轮子。django.contib.auth 已经有组和权限,只需使用它们;-)


推荐阅读