发现之前的新增和修改代码都会比较多,这次我们进行一下优化;
1.优化的前提,需了解
- 在
views.py
的方法中,创建序列化器对象时,如果只传参data
,那么在调用save()
方法时,实际上调用的是序列化器对象的create()
方法 - 在
views.py
的方法中,创建序列化器对象时,如果传参data
和instance
,那么在调用save()
方法时,实际上调用的是序列化器对象的update()
方法
2.基于上面,可进行的优化
- 可重写序列化器对象的
create()
方法,从而优化views.py
中的新增方法 - 可重写序列化器对象的
update()
方法,从而优化views.py
中的修改方法
-
- 在
ProjectsSerializer.py
中进行重写create
和update
方法
- 在
def create(self, validated_data):
"""
新增user
:param validated_data:
:return:
"""
return Projects.objects.create(**validated_data)
# 如果在创建UserSerializer对象时,传参data和instance,则在调用save()方法时,
# 实际调用的是序列化器对象中的update()方法
def update(self, instance, validated_data):
"""
更新user
:param instance:
:param validated_data:
:return:
"""
instance.name = validated_data['name']
instance.leader = validated_data['leader']
instance.tester = validated_data['tester']
instance.programer = validated_data['programer']
instance.publish_app = validated_data['publish_app'] # 这个字段只读,不进行反序列化,所以注释
instance.desc = validated_data['desc']
instance.save()
return instance
- 2.优化views.py的新增和修改方法
然后修改post
和update
方法
新增方法:
def post(self,request):
#新增项目
#1.从前端或者json格式的数据,转换为python中的类型;
#为了严谨,需要做各种检验
#比如:是否为json,传递的数据是否符合格式,必须传入的参数是否携带
json_data = request.body.decode('utf-8')
python_data= json.loads(json_data,encoding='utf-8')
#反序列化
serializer = ProjectsSerializer(data=python_data)
try:
serializer.is_valid(raise_exception=True)
except Exception as e:
return JsonResponse(serializer.errors)
serializer.save()
return JsonResponse(serializer.data,status=201)
修改方法:
def put(self,request,pk):
# 1.校验前端传递的pk(项目ID),类型正整数,是否存在
# 2.获取指定id为pk的待修改项目
project = Projects.objects.get(id = pk)
#3.从前端获取json格式的数据,
# 为了严谨,需要做各种检验
# 比如:是否为json,传递的数据是否符合格式,必须传入的参数是否携带
json_data = request.body.decode('utf-8')
python_data = json.loads(json_data, encoding='utf-8')
ser = ProjectsSerializer(data=python_data,instance=project)
try:
ser.is_valid(raise_exception=True)
except Exception as e:
return JsonResponse(ser.errors)
运行结果都可运行成功;