django rest-framework 1.序列化 二

在上一節說了Serializers的使用相似Django的From,在Django中有From也有ModelFrom,Serializers也是有個ModelSerializers,下面在講講restful的MldelSerializer序列化。前端

1、ModelSerializers

咱們來用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)
調用ModelSerializer類的視圖函數
相關文章
相關標籤/搜索