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')
  • 相关阅读:
    aws AWS CloudHSM
    aws Web server log analysis
    Monitor and Respond with AWS Config
    Amazon Cognito
    Amazon GuardDuty
    使用Reflactor反编译.Net程序的经验
    Windows Server 2008 25条常见问题
    解决C#读取EXCEL中数字无法读取的方法
    关于HOOK基础知识(windows API ,C++)
    Windows下Hook API 技术(HOOK SEND)
  • 原文地址:https://www.cnblogs.com/nbzyf/p/12156941.html
Copyright © 2011-2022 走看看