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