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的基 ...
随机推荐
- easyUI combobox 添加空白项
今天测试反馈了一个问题,希望可以在下拉框下面加一个空白的选项(下拉框用的是combobox方法). 开始分析这个问题: 首先,这个数据都是后台读出来的,那么我在后台直接添加可以么,答案是可以的,如果没 ...
- HDFS的7个设计特点
1.Block的放置:默认不配置.一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定Da ...
- Xamarin控件使用之ListView
listview单列多行的显示,以后再加多列多行的实例. [Activity(Label = "GraphicAll", LaunchMode = LaunchMode.Singl ...
- DNS搜索过程
以www.renyi.com为例 一:客户端首先检查本地HOST文件,是否有对应的IP地址,如果有,客户端直接访问,如果没有,则执行下一步. 二:客户端查看本地缓存信息,是否有对应的IP地址,如果有, ...
- EasyUI 修改 Messager 消息框大小
需求是要修改确认消息窗口的大小. 简单的调用方法是这样的: $.messager.confirm('操作确认', '确定批量编辑文章?', function (r) { ... } 这个时候生成的弹窗 ...
- 深度学习之 seq2seq 进行 英文到法文的翻译
深度学习之 seq2seq 进行 英文到法文的翻译 import os import torch import random source_path = "data/small_vocab_ ...
- HTML中的上下标标签的演示
HTML中的上下标标签的演示 #table_head>td { font-weight: bold } tr { text-align: center } 作用 标签 演示代码 呈现效果 上标 ...
- Tcl与Design Compiler (一)——前言
已经学习DC的使用有一段时间了,在学习期间,参考了一些书,写了一些总结.我也不把总结藏着掖着了,记录在博客园里面,一方面是记录自己的学习记录,另一方面是分享给大家,希望大家能够得到帮助.参考的书籍有很 ...
- 关于HTML
我的PHP学习之旅 学习PHP已经有一段时间了,今天才想好好的总结一下这一路走来的点点滴滴,也想把我的学习方法及经验分享给大家,希望能对你有所帮助. 首先学习的是PHP前端部分,这里需要学习的知识有H ...
- angular-单页面应用程序
我们都知道angularjs是单一页面应用程序,那什么是单一页面应用程序呢?单一页面应用程序到底有什么好处呢? 下面我们来看一下: 首先我觉得可以把页面的响应模式分成这样大概3个阶段: 1. 最传统的 ...