DRF序列化器和反序列化器的实现(serializer)

一、序列化

大概流程:先在serializers.py中定义序列化器类,然后在views.py中定义类,在类中定义get方法,方法中首先需要获取数据库数据(objects.all()),然后实例化序列化器,得到序列化器对象(使用已经定义好的序列化器对获取到的数据进行序列化操作),调用序列化器对象的data方法来获取转换后的数据,最后使用JsonResponse返回数据。

代码如下:

serializers.py

from rest_framework import serializers
from stuapi.models import Students
"""
serializers 是drf提供给开发者调用的序列化器模块
里面声明了所有的可用序列化器的基类;
Serializer      序列化器基类,drf中所有的序列化器都必须继承于Serializer
ModelSerializer 模型序列化器基类,是序列化器基类的子类,在工作中,除了Serializer基类以外,最常用的序列化器类基类
"""


class Student1Serializer(serializers.Serializer):
    """学生信息序列化器"""
    # 1.转换的字段说明
    # 字段 = serializers.字段类型(选项=选项值)
    id = serializers.IntegerField()
    name = serializers.CharField()
    sex = serializers.BooleanField()
    age = serializers.IntegerField()
    description = serializers.CharField()

views.py

from django.http.response import JsonResponse
from django.views import View

from stuapi.models import Students
from .serializers import Student1Serializer, Student2Serializer


class StudentView(View):
    def get1(self, request):
        """序列化器,序列化阶段的调用"""
        # 1.获取数据集
        serializer_list = Students.objects.all()
        # 2.实例化序列化器,得到序列化器对象
        serializer = Student1Serializer(instance=serializer_list, many=True)
        # 3.调用序列化对象的data属性方法获取转换后的数据
        data = serializer.data
        # 4.响应数据
        return JsonResponse(data, status=200, safe=False)

models.py

class Students(models.Model):
    ##学生信息
    name = models.CharField(max_length=100,verbose_name="姓名")
    sex = models.BooleanField(default=1,verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄",help_text="年龄不能小于0")
    classmate = models.CharField(max_length=5,verbose_name="班级编号")
    description = models.TextField(max_length=1000,verbose_name="个性签名")

    class Meta:
        db_table="tb_student"
        verbose_name = "学生"
        verbose_name_plural = verbose_name

二、反序列化

大概流程:先在serializers.py中定义反序列化器类,可以在类中定义数据的验证方法,例如:validate(self, attrs)----验证所有数据,validate_name(self, data)----验证数据的某个字段,定义添加数据create和更新数据update, 然后在views.py中先获取前端传来的数据,然后对数据进行实例化序列化器对象,并验证数据的合法性,最后返回结果(在方法中定义报错信息

serialiezers.py

from rest_framework import serializers
from stuapi.models import Students
"""
serializers 是drf提供给开发者调用的序列化器模块
里面声明了所有的可用序列化器的基类;
Serializer      序列化器基类,drf中所有的序列化器都必须继承于Serializer
ModelSerializer 模型序列化器基类,是序列化器基类的子类,在工作中,除了Serializer基类以外,最常用的序列化器类基类
"""

class Student2Serializer(serializers.Serializer):
    """学生信息反序列化器"""
    # 1.转换的字段说明
    # 字段 = serializers.字段类型(选项=选项值)
    id = serializers.IntegerField(read_only=True) # read_only=True,在客户端提交数据【反序列化阶段不会要求id字段】
    name = serializers.CharField(required=True) # required=True,反序列化阶段必填
    sex = serializers.BooleanField(default=True) # default=True,反序列化阶段,用户没填,默认为True
    age = serializers.IntegerField(max_value=100,min_value=0,error_messages={
        "min_value": "The Age Must Be 0 <= age",
        "max_value": "The Age Must Be age <=100",
        })  # age反序列化值必须是   0,否则序列化器无法识别
        validate开头的方法,会自动被is_valid调用的
        """
        if data in ['Python','Django']:
            raise serializers.ValidationError(detail='学生姓名不能为Python',code='validate_name')
        return data

    def create(self, validated_data):
        """
        添加数据操作,添加数据以后,就自动实现了从字典变成模型对象的过程
        方法名固定为create,固定参数validated_data就是验证成功以后的结果
        """
        student = Students.objects.create(**validated_data)
        return student

    def update(self, instance, validated_data):
        """
        更新数据操作
        方法名固定为update
        固定参数instance,实例化序列化器对象时,必须传入的模型
        固定参数validated_data就是验证成功以后的数据
        更新数据以后,就自动实现了从字典变成模型对象的过程
        """
        instance.name = validated_data["name"]
        instance.age = validated_data["age"]
        instance.sex = validated_data["sex"]
        instance.description = validated_data["description"]
        instance.save()

        return instance

views.py

import json

from django.http.response import JsonResponse
from django.views import View

from stuapi.models import Students
from .serializers import Student1Serializer, Student2Serializer

class StudentView(View):
    def get2(self,request):
        """反序列化,采用字段选项来验证数据{验证失败不抛出异常}"""
        # 1.获取前端传来的数据
        # data = json.dumps(request.body)
        data = {
            "name":"校长",
            "age":-10,
            "sex":1,
            "description":"很懒"
        }
        # 2.1 实例化序列化器对象
        serializer = Student2Serializer(data=data)
        # 2.2 验证数据是否合法
        ret = serializer.is_valid()
        # 3.作出判断,并返回结果
        if ret:
            return JsonResponse(dict(serializer.validated_data))
        else:
            return JsonResponse(dict(serializer.errors))

    def get3(self,request):
        """反序列化,采用字段选项来验证数据{验证失败抛出异常}"""
        # 1.获取前端传来的数据
        # data = json.dumps(request.body)
        data = {
            "name":"Xiaohong",
            "age":18,
            "sex":True,
            "description":"很懒"
        }
        # 2.1 实例化序列化器对象
        serializer = Student2Serializer(data=data)
        # 2.2 验证数据是否合法
        serializer.is_valid(raise_exception=True)
        # 3.返回数据结果
        return JsonResponse(dict(serializer.validated_data))


    def get4(self,request):
        """反序列化,新增数据"""
        # 1.获取前端传来的数据
        # data = json.dumps(request.body)
        data = {
            "name":"Xiaohong",
            "age":18,
            "sex":True,
            "description":"很懒的版本"
        }
        # 2.1 实例化序列化器对象
        serializer = Student2Serializer(data=data)
        # 2.2 验证数据是否合法
        serializer.is_valid(raise_exception=True)
        # # 3.返回数据结果
        # data = serializer.validated_data
        # # 在数据库中创建数据
        # student = Students.objects.create(**data)
        # serializer = Student2Serializer(instance=student)

        # 在serializer中定义create方法后,数据会自动保存
        serializer.save() # 会根据实例化序列化器的时候,是否传入instance属性来自动调用create或者update方法
        # 返回数据
        return JsonResponse(serializer.data,status=201)


    def get(self, request):
        """
        反序列化,验证数据后,更新数据库数据
        """
        pk = 5
        try:
            student = Students.objects.get(pk=pk)
        except Students.DoesNotExist:
            return JsonResponse({"errors":"该学生不存在!"})

        # 2.接收客户提交的数据
        # 模拟提交过来的数据
        data = {
            "name": "Xiaohong",
            "age": 18,
            "sex": True,
            "description": "更新数据测试"
        }

        # 3.修改实例化序列化器对象
        serializer = Student2Serializer(instance=student, data=data)

        # 4.验证数据是否合法
        serializer.is_valid(raise_exception=True)

        # 5.入库
        serializer.save()

        # 6.返回结果
        return JsonResponse(serializer.data, status=201)

希望本篇文章对你有所帮助!

你可能感兴趣的:(python,django)