模型(Model)
模型如下所示,模型以RABC为基础,从用户--角色--权限来进行说明,主要涉及的情况有一对多和多对多的情况
# 用户信息
class UserProfile(AbstractUser):
"""
自定义用户
"""
role = models.ForeignKey(Role, on_delete=models.SET_NULL, related_name=‘role_user‘,null=True, blank=True, verbose_name=‘角色‘,db_constraint=False)
class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.username
#角色信息
class Role(models.Model):
name = models.CharField(max_length=64, verbose_name=‘角色‘)
permission = models.ManyToManyField(Permission, verbose_name=‘权限路由‘, db_constraint=False)
description = models.TextField(blank=True, null=True, verbose_name=‘描述‘)
class Meta:
verbose_name = "角色"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
# 权限信息
class Permission(models.Model):
path = models.CharField(max_length=64, verbose_name=‘路径‘)
name = models.CharField(max_length=64, verbose_name=‘名称‘)
component = models.CharField(max_length=64, verbose_name=‘组件路径‘)
redirect = models.CharField(max_length=64, blank=True, null=True, verbose_name=‘重定向路径‘)
parent = models.ForeignKey(‘self‘, blank=True, null=True, on_delete=models.SET_NULL, related_name=‘parent‘,
verbose_name=‘父路由‘, db_constraint=False)
class Meta:
verbose_name = "权限"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
序列化(Serializer)
用户序列化
对于用户信息模型来说,我们通常会需要获取到的数据有,用户详情、用户列表详情,
class UserProfileModelSerializer(serializers.ModelSerializer):
"""
用户详情序列化类(用于userInfo)
"""
# 通常在获取用户时只需要获取用户角色的名称,如果不使用’serializers.CharField()‘默认获取的是外键的ID
role = serializers.CharField()
class Meta:
model = User
fields = [‘id‘, ‘username‘, ‘role‘]
# fields = "__all__" 代表序列化所有字段
通过接口获取用户的列表详情,则可获取到如下的数据返回:
角色序列化
普通序列化
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = [‘id‘, ‘name‘]
我在角色的序列化时遇到两种情况,一种只需要看到所有的角色列表,只需要上面的序列化代码解渴实现,结果如下图所示:
带反向查询的序列化
另外一种就是我需要看到每个角色下面有哪些用户,代码如下:
class RoleSerializer(serializers.ModelSerializer):
# 可以通过releated_name = 需要查询的序列化对象(many=True,read_only=True )来设置,fields里面要加上相应的字段
role_user = UserSerializers(many=True, read_only=True)
class Meta:
model = Role
fields = [‘id‘, ‘name‘, ‘role_user‘]
得到的结果如下