django - Django ORM:使用链接表连接两个表
问题描述
我想has_permission(self, permission_name)
在类中集成一个功能Profile
。为此,我想做一个返回权限名称列表的 ORM 语句。
数据模型为:
- 1 个用户有1 个配置文件(扩展 Django 的用户模型)
- 每个Profile都分配给一个ProfileGroup。但是,不同的Profile可以属于同一个ProfileGroup。
- 每个ProfileGroup可以有一个或多个ProfilePermissions。组可以具有相同的ProfilePermissions子集。Link-Table GroupPermissions使用两个
ForeignKeys
而不是ManyToMany
关系来处理这个问题。
我的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
)。
所以我必须加入两个表GroupPermissions
和ProfilePermission
. 我发现了一些东西prefetch_related
,select_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 已经有组和权限,只需使用它们;-)
推荐阅读
- excel - 读取和写入同一个 Excel 工作簿
- android - 使用 Android 版 GeoFirestore 时是否可以添加一些过滤器?
- java - 根据图像数据库arcore中检测到的图像索引显示不同的3D对象
- facebook - 如何从我的网络应用程序共享的 facebook graph api 中获取喜欢计数?
- windows - 在 handle.exe 上设置 UTF-8 编码?
- anaconda - 安装了哪个版本的anaconda?
- c++ - C++ 标准是否对向量赋值函数或构造函数有明确要求?
- php - 如何解决依赖下拉列表的错误?
- c++ - MinGW 构建中的 dll 导入库中定义的重复符号
- windows - 在哪里可以找到 Windows 更新目录?