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中的组可以分配多个权限