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类的视图函数
相关文章
相关标签/搜索