DRF 一對多序列化與反序列化


DRF 一對多序列化與反序列化

  • 序列化

    出庫的過程,是從數據庫中把數據讀出並以json的形式供前端使用

  • 反序列化

    入庫的過程,是從前端將數據傳入到views.py的函數或者類中,經過后台邏輯處理,最終寫到數據庫中。

  • 安裝 djangorestframework

    pip install djangorestframework

  • 注冊到INSTALL_APPS

    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
    
  • 配置數據庫

    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()),
    ]
    
  • 訪問地址

    • 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/

  • 獲取老師名下有多少個學生

    • 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)
      
    • 調用此地址 GET http://127.0.0.1:8000/snippets/teacher/

  • 獲取學生的老師是誰?

    • 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)
      
    • 調用此地址 GET http://127.0.0.1:8000/snippets/teacher/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM