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
验证结果:
-------------------------------------------
个性签名:不忘初心,方得始终!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!