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