zoukankan      html  css  js  c++  java
  • DRF 多对多序列化

    django rest framework 多对多序列化,折腾了好久,也没找到默认是怎么使用,只能自己重构了。

    1 model

    class Roles(models.Model):
        """
        角色信息
        """
        title = models.CharField(max_length=32,unique=True)
        label = models.CharField(max_length=64,null=True,blank=True)
    
    class Users(models.Model):
        """
        用户信息
        """
        username = models.CharField(max_length=32,unique=True)
        nick_name = models.CharField(max_length=64,null=True,blank=True)
        password = models.CharField(max_length=128)
        state = models.BooleanField(default=False)
        is_super = models.BooleanField(default=False)
        last_login = models.DateTimeField(auto_now=True)
        create_date = models.DateTimeField(auto_now_add=True)
        #用户 与 角色 多对多关系
        roles = models.ManyToManyField(to='Roles',)
    

    2 ,序列化

    from rest_framework import serializers
    from api import models
    
    
    #序列化入门
    class RoleSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Roles
            fields = "__all__"
    
    
    #序列化进阶3,自动序列化连表(depth)
    class UserSerializer(serializers.ModelSerializer):
        # 多对多
        class Meta:
            model = models.Users
            fields = "__all__"
            # 连表的深度
            depth = 1
    

    3 视图

    from api import models
    from rest_framework.viewsets import ModelViewSet
    from rest_framework.views import Response
    from api.serializers import rbac_serializers
    
    
    
    #fa0410e516206b1ad9c2efa6c9d3c60e
    
    class RolesViewSet(ModelViewSet):
        # 指定查询集
        queryset = models.Roles.objects.all()
        # 指定序列化器
        serializer_class = rbac_serializers.RoleSerializer
    
    
    class UsersViewSet(ModelViewSet):
        # 指定查询集
        queryset = models.Users.objects.all()
        # 指定序列化器
        serializer_class = rbac_serializers.UserSerializer
    
        def perform_create(self, serializer):
            serializer.save()
            req_data = self.request.data
            roles = req_data['roles']
            # 添加多对多对象
            obj = models.Users.objects.get(id=serializer.data['id'])
            for i in roles:
                role_obj = models.Roles.objects.get(id=i)
                obj.roles.add(role_obj)
                #把角色信息加入到序列化数据中
                serializer.data['roles'].append({'id':role_obj.id,'title':role_obj.title,'label':role_obj.label})
            return  serializer.data
    
        def perform_update(self, serializer):
            req_data = self.request.data
            roles = req_data['roles']
            user_id = req_data['id']
            obj = models.Users.objects.get(id=user_id)
            # 清空多对多对象
            obj.roles.clear()
            #添加多对多对象
            for i in roles:
                role_obj = models.Roles.objects.get(id=i['id'])
                obj.roles.add(role_obj)
            serializer.save()
    
        def perform_destroy(self, instance):
            #清空多对多对象
            instance.roles.clear()
            instance.delete()
    

    4 路由

    from django.urls import path,include
    from api.views import views_auth, views_rbac
    from rest_framework.routers import DefaultRouter
    
    router = DefaultRouter()
    router.register(r'roles', views_rbac.RolesViewSet)
    router.register(r'users', views_rbac.UsersViewSet)
    
    
    
    urlpatterns = [
        path(r'auth/', views_auth.AuthView.as_view()),
        path('',include(router.urls))
    ]
    
  • 相关阅读:
    人机博弈,吃子棋游戏(一)基本介绍
    cesm下载备注
    mysql数据库批量高速插入
    持续学习
    顺序表的功能实现
    Broccoli & Babel使用演示样例
    rk3188调试记录
    Operation not allowed on a unidirectional dataset错误?
    dbExpress操作中用TDBGrid显示数据
    dbexpress连接mysql提示Operation not allowed on a unidirectional dataset
  • 原文地址:https://www.cnblogs.com/xiao2er/p/13306494.html
Copyright © 2011-2022 走看看