django rest-framework 1.序列化 二

在上一节说了Serializers的使用类似Django的From,在Django中有From也有ModelFrom,Serializers也是有个ModelSerializers,下面在讲讲restful的MldelSerializer序列化。

一、ModelSerializers

我们来用ModelSerializer类重构serializer,利用ModelSerializer实现之前写的功能

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类的视图函数

 

posted @ 2017-09-25 23:17  40块钱抓娃娃  阅读(168)  评论(0编辑  收藏  举报