DRF many serialization and deserialization

DRF many serialization and deserialization

  • Serialization

    Process out of the library, the data is read from the database and in the form of front-end for the json

  • Deserialization

    The storage process, the incoming data is from the front end to views.py function or class spooled logic processing, the final written to the database.

  • Installation djangorestframework

    pip install djangorestframework

  • Sign up to INSTALL_APPSthe

    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
  • Configuration database

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'tutorial',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD': 'ocnt-123',
            'OPTIONS':{
                    "init_command":"SET foreign_key_checks = 0;",# 禁用外键约束
            }
        }
    }
  • 新增老师类和学生类

from django.db import models

# 创建老师模型
class Teacher(models.Model):
    # 教师名称
    name = models.CharField(max_length=32,unique=True)
    # 添加时间
    addtime = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 指定表名
        db_table = 'teacher'


# 创建学生模型,一个学生只能选择一个老师
class Student(models.Model):
    # 学生名称
    name = models.CharField(max_length=32,unique=True)
    # 添加时间
    addtime = models.DateTimeField(auto_now_add=True)
    # 外键 与Teacher类绑定
    teacher = models.ForeignKey('Teacher',on_delete=models.CASCADE)

    class Meta:
        # 指定表名
        db_table = 'student'
  • 新增视图函数类 TeacherView

    from rest_framework.views import  APIView
    from rest_framework.response import Response
    from .serializers import TeacherSerializer,StudentSerializer
    from . import models
    
    # 创建用户视图类
    class TeacherView(APIView):
        # 获取用户信息
        def get(self,request):
            data = models.Teacher.objects.all()
            info = TeacherSerializer(data,many=True)
            return Response({
                "status":200,
                "msg":"",
                "data":info.data
            })
    
    
    
        # 添加用户
        def post(self,request):
            data = request.data
            flag = models.Teacher.objects.create(**data)
            if not flag:
                return Response({"status":201,"msg":"添加数据失败","data":[]})
            return Response({"status":200,"msg":"","data":[]})
    
    
    
        # 编辑用户
        def put(self,request):
            id = request.data.pop("id")
            flag = models.Teacher.objects.filter(id=id).update(**request.data)
            if not flag:
                return Response({
                    "status":201,
                    "msg":"编辑失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"编辑成功",
                "data":""
            })
    
    
        # 删除用户
        def delete(self,request):
            id = request.data.pop('id')
            teacher = models.Teacher.objects.filter(id=id).delete()
            if not teacher[0]:
                return Response({
                    "status": 201,
                    "msg": "删除失败",
                    "data": []
                })
            return Response({
                "status": 200,
                "msg": "删除成功",
                "data": ""
            })
    
    • 新增视图函数类 StudentView
    # 学生视图
    class StudentView(APIView):
        # 获取数据
        def get(self,request):
            data = models.Student.objects.all()
            info = StudentSerializer(data,many=True)
    
            return Response({
                "status":200,
                "msg":"",
                "data":info.data
            })
    
        # 添加数据
        def post(self,request):
            data = request.data
            flag = models.Student.objects.create(**data)
            if not flag:
                return Response({
                    "status":201,
                    "msg":"学生添加失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"学生添加成功",
                "data":[]
            })
    
    
        # 编辑数据
        def put(self,request):
            id = request.data.pop('id')
            flag = models.Student.objects.filter(id=id).update(**request.data)
            if not flag:
                return Response({
                    "status":201,
                    "msg":"数据编辑失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"数据编辑成功",
                "data":[]
            })
    
        # 删除数据
        def delete(self,request):
            id = request.data.get('id')
            student = models.Student.objects.filter(id=id).delete()
            if not student[0]:
                return Response({
                    "status":201,
                    "msg":"删除失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"删除成功",
                "data":[]
            })
    
  • 序列化类 serializers.py

    from rest_framework import serializers
    from . import models
    
    # 老师数据序列化
    class TeacherSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Teacher
            fields = '__all__'
    
    
    # 学生数据序列化
    class StudentSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Student
            fields = '__all__'
    
  • 二级路由 urls.py

    from django.urls import path
    from . import views
    urlpatterns = [
        path('teacher/',views.TeacherView.as_view()),
        path('student/',views.StudentView.as_view()),
    ]
  • address

    • GET http://127.0.0.1:8000/snippets/teacher/
    • POST http://127.0.0.1:8000/snippets/teacher/
    • PUT http://127.0.0.1:8000/snippets/teacher/
    • DELETE http://127.0.0.1:8000/snippets/teacher/

    • GET http://127.0.0.1:8000/snippets/student/
    • POST http://127.0.0.1:8000/snippets/student/
    • PUT http://127.0.0.1:8000/snippets/student/
    • DELETE http://127.0.0.1:8000/snippets/student/

  • Gets the name of the teacher how many students

    • serializers.py

      from rest_framework import serializers
      from . import models
      
      # 学生数据序列化
      class StudentSerializer(serializers.ModelSerializer):
          class Meta:
              model = models.Student
              fields = '__all__'
      
      
      # 老师数据序列化
      class TeacherSerializer(serializers.Serializer):
          id = serializers.IntegerField()
          name = serializers.CharField(max_length=32)
          student_set = StudentSerializer(many=True,read_only=True)
    • Call this address GET http://127.0.0.1:8000/snippets/teacher/

  • Obtain student teacher who is?

    • serializers.py

      from rest_framework import serializers
      from . import models
      
      # 学生数据序列化
      class StudentSerializer(serializers.ModelSerializer):
          teacherName = serializers.CharField(source='teacher.name')
          class Meta:
              model = models.Student
              fields = ('id','name','teacherName')
      
      
      # 老师数据序列化
      class TeacherSerializer(serializers.Serializer):
          id = serializers.IntegerField()
          name = serializers.CharField(max_length=32)
          student_set = StudentSerializer(many=True,read_only=True)
    • Call this address GET http://127.0.0.1:8000/snippets/teacher/

Guess you like

Origin www.cnblogs.com/wuxiaoshi/p/11974279.html