zoukankan      html  css  js  c++  java
  • DRF 多对多序列化和反序列化

    一、 序列化

    • 查询所有的学生的信息,包括任课老师

      • 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')
  • 相关阅读:
    JS中字符串的true转化为boolean类型的true
    jquery select change下拉框选项变化判断选中值
    C# 使用 NPOI 库读写 Excel 文件
    通过微信分享链接,后面被加上from=singlemessage&isappinstalled=1导致网页打不开
    C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
    SQL查询语句如何能够让指定的记录排在最后
    搞懂 JavaScript 继承原理
    基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
    SqlServer 使用sys.dm_tran_locks处理死锁问题
  • 原文地址:https://www.cnblogs.com/nbzyf/p/12156941.html
Copyright © 2011-2022 走看看