在上一節說了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)