django.db
import models
class Menu(models.Model):
"""
菜单表
"""
title = models.CharField(verbose_name=
‘菜单名称‘,max_length=32,unique=
True)
icon = models.CharField(max_length=128, blank=True, null=
True)
def __str__(self):
return self.title
class Permission(models.Model):
"""
权限表
"""
title = models.CharField(verbose_name=
‘权限标题‘, max_length=32
)
url = models.CharField(verbose_name=
‘含正则的URL‘, max_length=128
)
name=models.CharField(verbose_name=
‘url别名‘,max_length=64,unique=True)
#控制权限到按钮
parent=models.ForeignKey(verbose_name=
‘父权限‘,to=
‘self‘,null=True,blank=True,on_delete=models.CASCADE,limit_choices_to={
‘parent__isnull‘:True})
#构建非菜单权限关系,菜单默认展开
menu=models.ForeignKey(verbose_name=
‘菜单‘,to=
‘Menu‘,null=True,blank=True,on_delete=
models.CASCADE)
def __str__(self):
return self.title
class Role(models.Model):
"""
角色
"""
title = models.CharField(verbose_name=
‘角色名称‘, max_length=32
)
permissions = models.ManyToManyField(verbose_name=
‘拥有的所有权限‘, to=
‘Permission‘, blank=
True)
def __str__(self):
return self.title
class UserInfo(models.Model):
"""
用户表
"""
username = models.CharField(verbose_name=
‘用户名‘, max_length=32
)
password = models.CharField(verbose_name=
‘密码‘, max_length=64
)
email = models.CharField(verbose_name=
‘邮箱‘, max_length=32
)
roles = models.ManyToManyField(verbose_name=
‘拥有的所有角色‘, to=Role, blank=
True)
class Meta:
abstract=True
#为了crm的用户表进行继承
def __str__(self):
return self.username
其中用户表和角色表是多对多的关系、角色表和权限表是多对多的关系。另外权限表关联菜单,这样某一个权限url挂载某一个菜单下,并且权限表关联自身,这样比如增加、删除、修改的权限url又可以挂在某一个权限url下面。
rbac组件之数据库设计(一)
标签:多对多 span 角色 info 用户 key bsp choice 别名