• 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的路由列表中
    
  • 相关阅读:
    [leetcode] Longest Palindromic Substring
    [leetcode] Add Two Numbers
    [leetcode] Longest Substring Without Repeating Characters
    [leetcode] Median of Two Sorted Arrays
    [leetcode] Two Sum
    poj 2718 Smallest Difference
    AOJ 0525 Osenbei
    poj3190 stall revertation
    poj1328Radar Installation
    poj 2376 Cleaning Shifts
  • 原文地址:https://www.cnblogs.com/dorian/p/12375239.html
Copyright © 2020-2023  润新知