1,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用来进行反序列化参数校验,给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.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有一些差别
同时给模型类对象传入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.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