Django ORM:使用链接 table 连接两个 table

Django ORM: Join two tables using a linked table

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

数据模型为:

我的 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 class 中)应该检查权限 permission 是否包含在权限列表中。我试过

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

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

所以我必须加入两个 Tables GroupPermissionsProfilePermission。我发现了 prefetch_relatedselect_related 但这并不像我想要的那样工作。

直接回答你的问题,

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 已有组和权限,只需使用它们;-)