zoukankan      html  css  js  c++  java
  • 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类的视图函数
  • 相关阅读:
    第二章:变量和简单数据类型
    第四章:操作列表
    第三章:列表简介
    老男孩Day6作业:计算器
    老男孩Day5作业:电子银行购物商城
    老男孩Day4作业:员工信息查询系统
    老男孩Day3作业:工资管理系统
    老男孩Day2作业:购物车程序
    改进地图的vo类
    slam kf
  • 原文地址:https://www.cnblogs.com/40kuai/p/7594487.html
Copyright © 2011-2022 走看看