在上一节说了Serializers的使用相似Django的From,在Django中有From也有ModelFrom,Serializers也是有个ModelSerializers,下面在讲讲restful的MldelSerializer序列化。前端
咱们来用ModelSerializer类重构serializer,利用ModelSerializer实现以前写的功能python
class Test_app_model_serializer(serializers.ModelSerializer): class Meta: model = models.Game fields = ('id', 'name', 'company', 'turnover') # 重要的是要记住,ModelSerializer类不会作任何特别神奇的事情,它们只是建立序列化器类的快捷方式,该类实现了一下两个功能: # 1. 一组自动肯定的字段。 # 2. 简单的默认实现create()和update()方法。
是使用ModelSerializer编写视图函数,这里的代码实现和上一节中的代码除了调用的Serializer类不通觉得,其余的都如出一辙。这里能够帮助你更好的理解ModelSerializer类都干了那些事儿。数据库
from django.shortcuts import render from django.http import HttpResponse, JsonResponse from django.views.decorators.csrf import csrf_exempt # 忽略post请求时的csrf问题 from test_app import serializer from test_app import models from rest_framework.renderers import JSONRenderer # restful提供的序列化类 from rest_framework.parsers import JSONParser # restful提供的反序列化类 # Create your views here. @csrf_exempt def game_list(request): if request.method == 'GET': game = models.Game.objects.all() # 获取数据库中全部数据 game_serializer = serializer.Test_app_model_serializer(instance=game, many=True) # 经过自定义的serializer实例化数据,many参数为True表示处理多条数据 # return HttpResponse(JSONRenderer().render(game_serializer.data), status=200) # 序列化serializer实例的数据 return JsonResponse(game_serializer.data,safe=False) elif request.method == 'POST': data = JSONParser().parse(request) # 经过JsonParser类反序列化POST过来的数据 game_serializer = serializer.Test_app_model_serializer(data=data) # 经过反序列化后的数据建立serializer实例 print(game_serializer) if game_serializer.is_valid(): # 经过is_valid()方法判断数据类型是否正确,这点和Django的From类似 game_serializer.save() # 验证经过保存数据,这里的game_serializer是自定义serializer的create函数返回的对象,进行保存 # return HttpResponse(JSONRenderer().render(game_serializer.data)) # 序列化数据返回前端 return JsonResponse(game_serializer.data,safe=False) else: # 验证不经过,输出对应的报错信息 print("验证不经过") # return HttpResponse(JSONRenderer().render(game_serializer.errors)) print(type(game_serializer.errors)) return JsonResponse(game_serializer.errors) # 注释同上 @csrf_exempt def game_info(request, game_id): game_obj = models.Game.objects.get(id=game_id) if request.method == 'GET': game_serializer = serializer.Test_app_model_serializer(instance=game_obj) data = JSONRenderer().render(game_serializer.data) return HttpResponse(data) elif request.method == 'PUT': data = JSONParser().parse(request) game_serializer = serializer.Test_app_model_serializer(instance=game_obj, data=data) if game_serializer.is_valid(): game_serializer.save() # return HttpResponse(JSONRenderer().render(game_serializer.data)) return JsonResponse(game_serializer.data, status=201) return JsonResponse(game_serializer.errors, status=400) elif request.method == 'DELETE': game_obj.delete() return HttpResponse(status=204)