【Django】restframework的外键序列化

模型(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__" 代表序列化所有字段

通过接口获取用户的列表详情,则可获取到如下的数据返回:
【Django】restframework的外键序列化

角色序列化

普通序列化

class RoleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Role
        fields = [‘id‘, ‘name‘]

我在角色的序列化时遇到两种情况,一种只需要看到所有的角色列表,只需要上面的序列化代码解渴实现,结果如下图所示:
【Django】restframework的外键序列化

带反向查询的序列化

另外一种就是我需要看到每个角色下面有哪些用户,代码如下:

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‘]

得到的结果如下
【Django】restframework的外键序列化

【Django】restframework的外键序列化

上一篇:parted命令,lvm


下一篇:JNI 基础用法相关总结