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

验证结果:

posted @ 2020-07-11 20:03  小公瑾  阅读(490)  评论(0编辑  收藏  举报