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

 

posted @   丿小贰灬  阅读(1319)  评论(0编辑  收藏  举报
编辑推荐:
· 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
点击右上角即可分享
微信分享提示