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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM