DRF框架serializer之视图优化

Posted xiaogongjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF框架serializer之视图优化相关的知识,希望对你有一定的参考价值。

一、create优化

在serializer序列化中,我们通过创建序列化器对象的方式大大地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下:

from django.http import JsonResponse
from django.views import View
from django.db import connection
import json
from .models import Projects
from .serializers import ProjectSerializer


class ProjectsPage(View):
    ‘‘‘
    类视图
    ‘‘‘
    def post(self, request):

        input_data = json.loads(request.body)

        serializer_check_obj = ProjectSerializer(data=input_data)

        if not serializer_check_obj.is_valid():
            return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})

        obj = Projects.objects.create(**serializer_check_obj.validated_data)

        serializer_obj = ProjectSerializer(instance=obj)
     return JsonResponse(serializer_obj.data, status=201)

如上我们可以看到,实际上我们创建了两个序列化器类对象,一个serializer_check_obj用于反序列化参数校验(给data传参),一个serializer_obj用于序列化输出(给instance传参),能不能只创建一个序列化器对象就能实现两个对象的功能呢?答案是可以的,我们可以去掉serializer_obj,然后调用serializer_check_obj的save()方法,save()方法会自动调用模型类对象中定义的create方法

    def post(self, request):

        input_data = json.loads(request.body)

        serializer_check_obj = ProjectSerializer(data=input_data)

        if not serializer_check_obj.is_valid():
            return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})

        serializer_check_obj.save()

        return JsonResponse(serializer_check_obj.validated_data, status=201)

模型类中的create方法需要提前定义,该方法是父类的create方法,我们可以进行重写,父类方法源码如下:

技术图片

 

 在序列化器类中重写父类的create方法,并返回模型类对象

    def create(self, validated_data):
        obj = Projects.objects.create(**validated_data)
        return obj

验证结果:

技术图片

在调用序列化器类对象的save()方法时,也可以传参,传参以关键字的方式传入,它会自动添加到create方法的validated_data中,我们可以根据这个参数去进行一些关联,如判断当前项目已登录,或者当前这个项目判断是哪个用户创建的

二、update优化

原代码如下:

    def put(self, request, pk=None):
        if pk:
            update_data = json.loads(request.body)
            obj = Projects.objects.get(id=pk)

            serializer_check_obj = ProjectSerializer(data=update_data)
            if not serializer_check_obj.is_valid():
                return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})

            obj.name = serializer_check_obj.validated_data.get(name) or obj.name
            obj.leader = serializer_check_obj.validated_data.get(leader) or obj.leader
            obj.programmer = serializer_check_obj.validated_data.get(programmer) or obj.programmer
            obj.tester = serializer_check_obj.validated_data.get(tester) or obj.tester
            obj.save()

            serializer_obj = ProjectSerializer(instance=obj)

            return JsonResponse(serializer_obj.data, status=201)

上面创建了两个序列化器类的对象,我们也可以进行合并,合并方式跟create有点差别,这里是给模型类对象同时传入data和instance,然后调用save()方法,它会自动去调用序列化器类中的update方法

优化后的put方法:

    def put(self, request, pk=None):
        if pk:
            update_data = json.loads(request.body)
            obj = Projects.objects.get(id=pk)

            serializer_obj = ProjectSerializer(data=update_data, instance=obj)
            if not serializer_obj.is_valid():
                return JsonResponse({"code": 1, "res": "error", "msg": serializer_obj.errors})

            serializer_obj.save()

            return JsonResponse(serializer_obj.data, status=201)

模型类中的update方法需要提前定义,该方法是父类的update方法,我们可以进行重写,父类方法源码如下:

技术图片

  在序列化器类中重写父类的update方法,并返回模型类对象

    def update(self, instance, validated_data):
        # instance为待更新的模型类对象
        # validated_data参数为校验通过之后的数据
        # 必须将更新成功的模型类对象返回
        instance.name = validated_data.get(name) or instance.name
        instance.leader = validated_data.get(leader) or instance.leader
        instance.programmer = validated_data.get(programmer) or instance.programmer
        instance.tester = validated_data.get(tester) or instance.tester
        instance.save()
        return instance

验证结果:

技术图片

以上是关于DRF框架serializer之视图优化的主要内容,如果未能解决你的问题,请参考以下文章

DRF框架之Serializer序列化器的序列化操作

DRF框架之 serializers 序列化组件

DRF框架之mixins

DRF框架GenericAPIView之过滤查询

DRF框架之ModelSerializer序列化器

drf框架4-views视图家族操作