DRF 多对多序列化和反序列化
Django 序列化和反序列化
一、 序列化
-
查询所有的学生的信息,包括任课老师
-
models.py
from django.db import models # 学生类 class Student(models.Model): name = models.CharField(max_length=32) # 老师类 class Teacher(models.Model): name = models.CharField(max_length=32) students = models.ManyToManyField(to='Student',related_name='teacher')
-
serializer.py
from rest_framework import serializers from . import models # 老师序列化 class TeacherSerializer(serializers.ModelSerializer): class Meta: model = models.Teacher fields = ('id','name') # 学生序列化 class StudentSerializer(serializers.Serializer): name = serializers.CharField(max_length=32) teacher = TeacherSerializer(many=True,read_only=True)
-
views.py
# 查询所有的学生对应的老师 studentobj = models.Student.objects.all() stu = StudentSerializer(studentobj,many=True) return Response(stu.data)
-
结果
[ { "name": "小张", "teacher": [ { "id": 3, "name": "郑老师" } ] }, { "name": "小李", "teacher": [ { "id": 4, "name": "董老师" } ] }, { "name": "小夏", "teacher": [] }, { "name": "小徐", "teacher": [] } ]
-
-
查询所有的老师的信息,包括所教学生
-
models.py
from django.db import models # 学生类 class Student(models.Model): name = models.CharField(max_length=32) # 老师类 class Teacher(models.Model): name = models.CharField(max_length=32) students = models.ManyToManyField(to='Student',related_name='teacher')
-
serializer.py
from rest_framework import serializers from . import models # 学生序列化 class StudentSerializer(serializers.ModelSerializer): class Meta: model = models.Teacher fields = ('id','name') # 老师序列化 class TeacherSerializer(serializers.Serializer): name = serializers.CharField(max_length=32) students = StudentSerializer(many=True,read_only=True)
-
views.py
teacherobj = models.Teacher.objects.all() teach = TeacherSerializer1(teacherobj,many=True) return Response(teach.data)
-
结果
[ { "name": "王老师", "students": [] }, { "name": "刘老师", "students": [] }, { "name": "郑老师", "students": [ { "id": 1, "name": "小张" } ] }, { "name": "董老师", "students": [ { "id": 2, "name": "小李" } ] } ]
-
二、反序列化
-
老师添加学生
-
models.py
from django.db import models # 学生类 class Student(models.Model): name = models.CharField(max_length=32) # 老师类 class Teacher(models.Model): name = models.CharField(max_length=32) students = models.ManyToManyField(to='Student',related_name='teacher')
-
serializer.py
# 反序列化 class TeacherUnserializer(serializers.Serializer): id = serializers.IntegerField() student_id = serializers.ListField() def create(self,data): tid = data.pop('id') student_id = data.pop('student_id') teacherobj = models.Teacher.objects.filter(id=tid).first() teacherobj.students.set( student_id ) return teacherobj
-
views.py
data = { "id":2, "student_id":[1,2,3,4] } obj = TeacherUnserializer(data=data) if obj.is_valid(): obj.save() print(obj.errors) return Response('ok')
-
-
学生添加老师
-
models.py
from django.db import models # 学生类 class Student(models.Model): name = models.CharField(max_length=32) # 老师类 class Teacher(models.Model): name = models.CharField(max_length=32) students = models.ManyToManyField(to='Student',related_name='teacher')
-
serializer.py
# 反序列化 class StudentUnserializer(serializers.Serializer): id = serializers.IntegerField() teacher_id = serializers.ListField() def create(self,data): id = data.pop('id') teacher_id = data.pop('teacher_id') studentobj = models.Student.objects.filter(id=id).first() studentobj.teacher.set( teacher_id ) return studentobj
-
views.py
data = { "id": 2, "teacher_id": [1, 2, 3, 4] } obj = StudentUnserializer(data=data) if obj.is_valid(): obj.save() print(obj.errors) return Response('ok')
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端