• django rest-framework 1.序列化 一


    上图为项目完整的目录结构

    一、入门

    需要先安装需要使用到包

    pip install django
    pip install djangorestframework

    先来创建一个新项目

    django-admin startproject restful
    cd restful
    # 创建一个应用
    python manage.py startapp rest_app  

    要想使用rest_framework 需要在django项目下的settings配置文件中的INSTALLED_APPS配置中添加如下配置:

    INSTALLED_APPS = (
        ...
        'rest_framework',
        'rest_app.apps.Test_appConfig',
    )
    # 如果您的django版本小于1.9,需要把rest_app.apps.Test_appConfig更换完rest_app
    

    二、创建一个可用的模型

    自定义一个游戏信息表

    class Game(models.Model):
        name = models.CharField(verbose_name='游戏名',max_length=64)
        company = models.CharField(verbose_name='公司',max_length=64)
        turnover = models.IntegerField(verbose_name='营业额')
        def __str__(self):
            return self.name
    # python manage.py makemigrations
    # python manage.py migrate # 生成数据库
    # python manage.py createsuperuser  # 创建管理员

    在创建数据库后,利用django admin 后台添加几条数据以备后用

    三、创建一个serializer类

    讲一下什么是serializer:

      serializer 类是用来序列化通过继承该类,可以把数据按照自定义的格式进行序列化。可以重写父类的方法对数据进行操作。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    __author__ = '40kuai'
    
    from rest_framework import serializers
    from test_app import models
    
    # 定义一个关于刚才新建Game表的一个序列化类,用来验证和序列化Game表数据
    class Test_app_serializer(serializers.Serializer):    # 继承serializers.Serializer类
        name = serializers.CharField(max_length=64)
        company = serializers.CharField(max_length=64)
        turnover = serializers.IntegerField()
    
        # 定义的create方法来实现新建数据,在子类中不重写改方法会raise NotImplementedError('`create()` must be implemented.')
        def create(self, validated_data):    
            return models.Game.objects.create(**validated_data)
    
        def update(self, instance, validated_data): # 同上,不重写会raise 异常
            instance.game = validated_data.get('name', instance.name)
            instance.company = validated_data.get('company', instance.company)
            instance.turnover = validated_data.get('turnover', instance.turnover)
            return instance    

    serializer类 的使用方法和django的From表单的验证相似。首先是要定义你要进行验证的字段,需要按照Game表中对数据的格式要求来定义每个字段,Serializer类也会按照自定义的字段来序列化相应的字段,

    create 和 update方法在用户进行创建,修改数据时会用到,在父类中这两个方法是要求重写的(没有强制要求)。注:父类中使用的是raise 方法来实现重写功能。

    四、路由和视图函数

    这里的路由函数是把所有的路由放到了test_app的urls.py 下,具体配置如下:

    # /restful/restful/urls.py 
    from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/', include('test_app.urls')),# 指向test_app下的urls.py ]
    # /restful/test_app/urls.py
    from django.conf.urls import url from django.contrib import admin from test_app import views urlpatterns = [ url(r'^game_list/',views.game_list), # 显示所有相关信息(GET)和创建新数据(POST) url(r'^game_info/(d+)/', views.game_info),  # 显示单条数据(GET)以及对数据进行修改(POST) ]

    路由就这么点,没什么可讲的,下面才是重点,开始说下视图函数,视图函数,视图函数,视图函数,视图函数

    from django.shortcuts import render
    from django.http import HttpResponse
    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_serializer(instance=game,
                                                             many=True)  # 通过自定义的serializer实例化数据,many参数为True表示处理多条数据
            return HttpResponse(JSONRenderer().render(game_serializer.data))  # 序列化serializer实例的数据
        elif request.method == 'POST':
            data = JSONParser().parse(request)  # 通过JsonParser类反序列化POST过来的数据
            game_serializer = serializer.Test_app_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)) # 序列化数据返回前端
            else:  # 验证不通过,输出对应的报错信息
                print("验证不通过")
                return HttpResponse(JSONRenderer().render(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_serializer(instance=game_obj)
            data = JSONRenderer().render(game_serializer.data)
            return HttpResponse(data)
        elif request.method == 'POST':
            data = JSONParser().parse(request)
            game_serializer = serializer.Test_app_serializer(instance=game_obj, data=data)
            if game_serializer.is_valid():
                game_serializer.save()
                return HttpResponse(JSONRenderer().render(game_serializer.data))
            else:
                return HttpResponse(JSONRenderer().render(game_serializer.errors))
  • 相关阅读:
    希尔排序
    折半插入排序
    自学git心得-2
    读书笔记-1 《人月神话》
    USTCCourseCommunity 项目介绍
    自学git心得-1
    HDU 2006 求奇数的乘积
    HDU 2007 平方和与立方和
    HDU 2005 第几天?
    HDU 2004 成绩转换
  • 原文地址:https://www.cnblogs.com/40kuai/p/7571985.html
Copyright © 2020-2023  润新知