1,create优化
在serializer序列化中,我们通过创建序列化器对象的方式大大地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下:
from django.http import JsonResponsefrom django.views import Viewfrom django.db import connectionimport jsonfrom .models import Projectsfrom .serializers import ProjectSerializerclass 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用来进行反序列化参数校验,给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中,我们可以根据这个参数去进行一些关联,如判断当前项目已登录,或者当前这个项目判断是哪个用户创建的
2,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.nameobj.leader = serializer_check_obj.validated_data.get('leader') or obj.leaderobj.programmer = serializer_check_obj.validated_data.get('programmer') or obj.programmerobj.tester = serializer_check_obj.validated_data.get('tester') or obj.testerobj.save()serializer_obj = ProjectSerializer(instance=obj)return JsonResponse(serializer_obj.data, status=201)
同前面一样,创建了两个序列化器类的对象,可以对其进行合并,合并方式跟create有一些差别
同时给模型类对象传入instance 和 data,之后调用save()方法,会默认去调用源码中的update方法
优化之后的代码
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.nameinstance.leader = validated_data.get('leader') or instance.leaderinstance.programmer = validated_data.get('programmer') or instance.programmerinstance.tester = validated_data.get('tester') or instance.testerinstance.save()return instance
 
