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

Django ORM:使用链接表连接两个表,django,django-orm,Django,Django Orm,我想在类配置文件中集成一个具有权限(self,permission\u name)的函数。 为此,我想做一个ORM语句,它返回一个权限名称列表 数据模型为: 1用户拥有1配置文件(扩展Django的用户模型) 每个档案分配给一个档案组。 但是,不同的配置文件可以属于相同的配置文件组 每个档案组可以有一个或多个档案权限。组可以具有相同的ProfilePermissions子集。链接表GroupPermissions使用两个foreignkey而不是manytomy关系来处理此问题 我的mode

我想在类
配置文件
中集成一个具有权限(self,permission\u name)的函数
。
为此,我想做一个ORM语句,它返回一个权限名称列表

数据模型为:

  • 1用户拥有1配置文件(扩展Django的用户模型)
  • 每个档案分配给一个档案组。 但是,不同的配置文件可以属于相同的配置文件组
  • 每个档案组可以有一个或多个档案权限。组可以具有相同的ProfilePermissions子集。链接表GroupPermissions使用两个
    foreignkey
    而不是
    manytomy
    关系来处理此问题
我的
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
函数
具有_权限
(在
配置文件
类中)应检查权限列表中是否包含权限
权限
。我试过了

权限列表=GroupPermissions.objects.filter(group=self.group)

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


因此,我必须加入两个表
GroupPermissions
ProfilePermission
。我发现了与预回迁相关的
选择与回迁相关的
,但这并不是我想要的。

直接回答你的问题

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

如果我没弄错的话,组和权限之间没有直接的联系。我希望用户只被分配到一个组,然后该组为用户分配相应的权限。@michaelT有一个链接,contrib.auth.models中的组可以分配多个权限