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