0017 DRF框架开发(04 普通序列化器)

  普通序列化器和模型无关,只是对针对提交字段的定义。

  本文定义三个序列化器:

  教师序列化器,学生序列化器,教师学生序列化器。这三个序列化器都使用普通序列化器。

1 教师序列化器

  在Applications/Examples/views下创建一个Teachaer.py文件。

from rest_framework import serializers
from Applications.Examples.models import Teachers
from rest_framework.viewsets import ModelViewSet


# from rest_framework.response import Response


class TeachersSerializer(serializers.Serializer):
    """
    【功能描述】教师序列化器
    """
    name = serializers.CharField(max_length=50, min_length=2, help_text='教师姓名')
    school_id = serializers.IntegerField(help_text='学校ID')

    def create(self, validated_data):
        teacher = Teachers.objects.create(**validated_data)
        return teacher

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name')
        instance.school_id = validated_data.get('school_id')
        instance.save()
        return instance


class TeachersViewSet(ModelViewSet):
    """
    教师视图
    """
    queryset = Teachers.objects.all()
    serializer_class = TeachersSerializer 

2 学生序列化器

  在Applications/Examples/views下创建一个Student.py文件。

from rest_framework import serializers
from Applications.Examples.models import Students
from rest_framework.viewsets import ModelViewSet


# from rest_framework.response import Response


class StudentsSerializer(serializers.Serializer):
    """
    【功能描述】学生序列化器
    """
    name = serializers.CharField(max_length=50, min_length=2, help_text='教师姓名')
    SEX_CHOICE = (
        (1, '男'),
        (2, '女'),
    )
    sex = serializers.ChoiceField(choices=SEX_CHOICE, required=False, help_text='性别')
    SUBJECT_CHOICE = (
        (1, '大学语文'),
        (2, '微信分'),
        (3, '计算机组成原理'),
        (4, '计算机网络'),
        (5, '英语'),
    )
    subject = serializers.MultipleChoiceField(choices=SUBJECT_CHOICE, help_text='所选科目')
    school_id = serializers.IntegerField(help_text='学校ID')

    def create(self, validated_data):
        teacher = Students.objects.create(**validated_data)
        return teacher

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name')
        # request=False,表示可传可不传,故需要判定,如果传了则修改,不传则不修改。
        if validated_data.get('sex'):
            instance.sex = validated_data.get('sex')
        instance.subject = validated_data.get('subject')
        instance.school_id = validated_data.get('school_id')
        instance.save()
        return instance


class StudentsViewSet(ModelViewSet):
    """
    学生视图
    """
    queryset = Students.objects.all()
    serializer_class = StudentsSerializer

3 教师学生序列化器

  在Applications/Examples/views下创建一个TeachaerStudent.py文件。

from rest_framework import serializers
from Applications.Examples.models import TeacherAndStudent
from rest_framework.viewsets import ModelViewSet


# from rest_framework.response import Response


class TeacherAndStudentSerializer(serializers.Serializer):
    """
    【功能描述】教师学生序列化器
    """
    teacher_id = serializers.IntegerField(help_text='教师ID')
    student_id = serializers.IntegerField(help_text='学生ID')

    def create(self, validated_data):
        tea_stu = TeacherAndStudent.objects.create(**validated_data)
        return tea_stu

    def update(self, instance, validated_data):
        instance.teacher_id = validated_data.get('teacher_id')
        instance.student_id = validated_data.get('student_id')
        instance.save()
        return instance


class TeacherAndStudentViewSet(ModelViewSet):
    """
    教师学生视图
    """
    queryset = TeacherAndStudent.objects.all()
    serializer_class = TeacherAndStudentSerializer

4 路由配置

  找到Examples的分路由文件urls.py,增加以上三个路由。

from django.urls import path
from Applications.Examples.views import ExpHome, CoreAPI
from rest_framework.routers import DefaultRouter
from .views.Serializer1 import UserInfoViewSet1
from .views.Serializer2 import UserInfoViewSet2
# from .views.Serializer3 import SchoolsViewSet
from .views.Schools import SchoolsViewSet
from .views.Teacher import TeachersViewSet
from .views.Student import StudentsViewSet
from .views.TeacherStudent import TeacherAndStudentViewSet

urlpatterns = [
    path('ExpHome/', ExpHome.ExoHome.as_view()),
    path('CoreAPI/', CoreAPI.CoreAPI.as_view()),
    path('LoginHome/', CoreAPI.LoginHome.as_view()),
    # path('Teachers/', TeachersViewSet.as_view()),
]
router = DefaultRouter()  # 可以处理视图的路由器
router.register('UserInfo1', UserInfoViewSet1)  # 向路由器中注册视图集
router.register('UserInfo2', UserInfoViewSet2)  # 向路由器中注册视图集
router.register('Schools', SchoolsViewSet)  # 向路由器中注册视图集
router.register('Teachers', TeachersViewSet)  # 向路由器中注册视图集
router.register('Student', StudentsViewSet)  # 向路由器中注册视图集
router.register('TeacherStudent', TeacherAndStudentViewSet)  # 向路由器中注册视图集

urlpatterns += router.urls  # 将路由器中的所以路由信息追到到django的路由列表中
原文地址:https://www.cnblogs.com/dorian/p/12375239.html