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))
django rest-framework 1.序列化 一的更多相关文章
- Django Rest framework 之 序列化
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django REST Framework的序列化器是什么?
# 转载请留言联系 用Django开发RESTful风格的API存在着很多重复的步骤.详细可见:https://www.cnblogs.com/chichung/p/9933861.html 过程往往 ...
- Django Rest Framework(2)-----序列化详解(serializers)
REST framework中的序列化类与Django的Form和ModelForm类非常相似.我们提供了一个Serializer类,它提供了一种强大的通用方法来控制响应的输出,以及一个ModelSe ...
- Django restful Framework 之序列化与反序列化
1. 首先在已建好的工程目录下新建app命名为snippets,并将snippets app以及rest_framework app加到工程目录的 INSTALLED_APPS 中去,具体如下: IN ...
- Django rest framework之序列化小结
最近在DRF的序列化上踩过了不少坑,特此结合官方文档记录下,方便日后查阅. [01]前言 serializers是什么?官网是这样的”Serializers allow complex d ...
- django rest framework serializers序列化
serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用: - 将queryset与model实例等进行序列化,转化成json格式,返回给用户(a ...
- DRF Django REST framework 之 序列化(三)
Django 原生 serializer (序列化) 导入模块 from django.core.serializers import serialize 获取queryset 对queryset进行 ...
- django-插件django REST framework,返回序列化的数据
官网: http://www.django-rest-framework.org 1.安装 pip install djangorestframework 2.在setting.py中注册app 中添 ...
- django rest framework serializers
django rest framework serializers序列化 serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用:- 将qu ...
- django rest framework 项目创建
Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Rest Framework Django REST Framework可以在Django的基 ...
随机推荐
- AWK读书笔记
1.awk 'parttern {action}' filename 从文件中逐行读取并匹配parttern,若匹配成功执行action否则读取下一行. parttern和action都可选,若省略p ...
- SQL之Left Join 关联条件的探讨
在测试工作中,有时需要测试数据库数据经过sql计算后的结果是否满足某一功能查询得到的返回值. 针对某些需要功能需要联查多张表,此时 关联 的作用就异常重要了,而针对多表关联,其中 关联条件的重要性不言 ...
- Syabse数据库无法启动的解决方案
在探讨本问题之前,首先要为大家解释一下Syabse数据库本身.Syabse数据库应用和本身的架构相对而言都相对比较复杂,多数技术人员及公司对Sybase数据库底层结构和运行机制也处于并非完全了解的阶段 ...
- Ubuntu server 16.04 中文版 终端不能显示中文的解决办法探讨
对于刚安装成功的Ubuntu server 16.04中文版,在终端显示中文的地方总是出现菱形的图标,看来该版本内置终端暂时不支持中文显示, 还是本人不知道具体操作配置,现通过百度查找以下几个解决方案 ...
- python小练习之一
下面的练习本身不难,比如打印1到10,计算1+2+3+...+100 ,最后一个是计算 1-2+3-4...-100 用了类的方法实现 用了列表生成器 用"高级"一丢丢的写法来实现 ...
- LeetCode & Q28-Implement strStr-Easy
String Two Pointers Description: Implement strStr(). Returns the index of the first occurrence of ne ...
- MySQL默认储存引擎修改
1.输入以下SQL语句查看当前储存引擎支持: SHOW ENGINES; 如图所示本机默认引擎为MyISAM: 2.若要修改引擎执行: ALTER TABLE 表名 ENGINE = 储存引擎名: 3 ...
- Mego(04) - Mego入门
本教程演示创建一个简单的数据库访问及更新数据的示例以便于初步了解下Mego框架的使用. 文中使用Visual Studio 2017版本. 创建Visual Studio项目 创建一个名为 MegoS ...
- OAuth2.0学习(1-5)授权方式2-简化模式(implicit grant type)
授权方式2-简化模式(implicit grant type) 简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授 ...
- "共振式”项目管理
"共振式”项目管理--是我第一个提出的吗?:) 脑子里突然想到项目管理的一些事情,然后想到项目其实是有节奏的,项目中的人员其实如果找到了这个节奏,踏准了节奏,一切将是顺风顺水. 刚准备动笔时 ...