DRF 多对多序列化
django rest framework 多对多序列化,折腾了好久,也没找到默认是怎么使用,只能自己重构了。
1 model
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 ,序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 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 路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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)) ] |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 从零开始:基于 PyTorch 的图像分类模型
· [WPF] 在RichTextBox中输出Microsoft.Extension.Logging库的
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1