rest-framework组件 之 序列化
浏览目录
restful协议
一切皆是资源,操作只是请求方式。
rest-framework
针对数据:json数据。
创建一个序列化类
简单使用
开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json
之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。
models
from django.db import models # Create your models here. class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name
views
from django.views import View
from .models import *
class PublishView(View):
def get(self,request):
# 序列化方式一
# publish_list=list(Publish.objects.all().values("id","name","email")) #queryset不能进行序列化,强转为list。
# return HttpResponse(json.dumps(publish_list)) #转化为json字符串
# 结果:[{"name": "\u82f9\u679c\u51fa\u7248\u793e", "email": "123@qq.com", "id": 1},
# {"name": "\u6843\u5b50\u51fa\u7248\u793e", "email": "456@qq.com", "id": 2}] # 序列化方式二
# publish_list=Publish.objects.all()
# temp=[]
# for obj in publish_list:
# temp.append({
# "id":obj.pk,
# "name":obj.name,
# "email":obj.email
# })
# return HttpResponse(json.dumps(temp))
# 结果:[{"id": 1, "name": "\u82f9\u679c\u51fa\u7248\u793e", "email": "123@qq.com"},
# {"id": 2, "name": "\u6843\u5b50\u51fa\u7248\u793e", "email": "456@qq.com"}]
# 以上方式优化
# from django.forms.models import model_to_dict
# publish_list = Publish.objects.all()
# temp = []
# for obj in publish_list:
# temp.append(model_to_dict(obj)) # 序列化方式三
from django.core import serializers #django的序列化组件
publish_list = Publish.objects.all()
ret=serializers.serialize("json",publish_list)
return HttpResponse(ret)
# 结果:
# [{"model": "app01.publish", "pk": 1, "fields": {"name": "\u82f9\u679c\u51fa\u7248\u793e", "email": "123@qq.com"}},
# {"model": "app01.publish", "pk": 2, "fields": {"name": "\u6843\u5b50\u51fa\u7248\u793e", "email": "456@qq.com"}}]
我们来看一下如何用rest-framework进行序列化。
from django.core import serializers
from .models import *
from rest_framework.response import Response
from rest_framework import serializers
from rest_framework.views import APIView
# 为queryset,model对象做序列化
# 实例化一个类
class PublishSerializers(serializers.Serializer):
# 需要序列化的字段
name=serializers.CharField()
email=serializers.CharField()
class PublishView(APIView):
def get(self,request):
# 方式四:restframework
publish_list = Publish.objects.all()
ps = PublishSerializers(publish_list, many=True) #实例化一个对象
return Response(ps.data)
# 结果:[{"name":"苹果出版社","email":"123@qq.com"},{"name":"桃子出版社","email":"456@qq.com"}]
注意:如果是对queryset做序列化,就要加many=True.如果是对model对象做序列化,就是many=False.默认为false,可以不用写。
实例化的时候要是数据是一个 queryset 我们要加 many = True ret = PublishSerializers(publish_list, many=True) ret.data ------------------------------------拿到的是一个OrderDict。
实例化的时候要是数据是一个model对象,many默认是一个False(可以不写) ret = PublishSerializers(obj) ret.data ------------------------------------拿到的是一个字典
ModelSerializer
class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields="__all__"
depth=1
提交post请求
def post(self,request,*args,**kwargs): bs=BookSerializers(data=request.data,many=False)
if bs.is_valid():
# print(bs.validated_data)
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)
重写save的create方法
class BookSerializers(serializers.ModelSerializer): class Meta:
model=Book
fields="__all__"
# exclude = ['authors',]
# depth=1 def create(self, validated_data): authors = validated_data.pop('authors')
obj = Book.objects.create(**validated_data)
obj.authors.add(*authors)
return obj
单条数据的get和put请求
class BookDetailViewSet(APIView): def get(self,request,pk):
book_obj=Book.objects.filter(pk=pk).first()
bs=BookSerializers(book_obj)
return Response(bs.data) def put(self,request,pk):
book_obj=Book.objects.filter(pk=pk).first()
bs=BookSerializers(book_obj,data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)
超链接API
class BookSerializers(serializers.ModelSerializer):
publish= serializers.HyperlinkedIdentityField(
view_name='publish_detail',
lookup_field="publish_id",
lookup_url_kwarg="pk")
class Meta:
model=Book
fields="__all__"
#depth=1
urls
urlpatterns = [
url(r'^books/$', views.BookViewSet.as_view(),name="book_list"),
url(r'^books/(?P<pk>\d+)$', views.BookDetailViewSet.as_view(),name="book_detail"),
url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"),
url(r'^publishers/(?P<pk>\d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),
]
总结:
1、queryset对象不能进行序列化。
rest-framework组件 之 序列化的更多相关文章
- 解析器组件和序列化组件(GET / POST 接口设计)
前言 我们知道,Django无法处理 application/json 协议请求的数据,即,如果用户通application/json协议发送请求数据到达Django服务器,我们通过request.P ...
- Spring Framework 组件注册 之 @Import
Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可 ...
- Spring Framework 组件注册 之 @Component
Spring Framework 组件注册 之 @Component 写在前面 在spring大行其道的今天,对于spring的使用和掌握乃是不可缺少的必备技能.但是spring的整个体系尤为庞大,对 ...
- Spring Framework 组件注册 之 FactoryBean
Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...
- 【转载】C#使用Newtonsoft.Json组件来序列化对象
在Asp.Net网站开发的过程中,很多时候会遇到对象的序列化和反序列化操作,Newtonsoft.Json组件是专门用来序列化和反序列化操作的一个功能组件,引入这个DLL组件后,就可使用JsonCon ...
- 基于Django的Rest Framework框架的序列化组件
本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化
一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...
- 安装.NET Framework组件时,电脑意外重启后再次安装失败
因为软件运行环境需要安装.Net Framework,我安装的是2.0sp版本,可以安装过程中计算机意外关闭,重新打开后再次安装却出现安装失败的提示,具体内容是: 产品: Microsoft .NET ...
- python-django rest framework框架之序列化
序列化与反序列化: 对象 -> 字符串 序列化 字符串 -> 对象 反序列化 rest framework序列化+Form 目的: 解决QuerySet序列化问题 功能:解析 和 过滤 - ...
- [Learn AF3]第四章 App framework组件之Button
Button 组件名称:Button 是否js控件:否 使用说明:如果说panel组件是af3的“核心(heart of the ui)”,那么Button就是af中的五虎上将之 ...
随机推荐
- 剑指offer--14.求1+2+3+...+n
&&短路原理 ------------------------------------------------------------------------------------- ...
- 2018.7.7 MBA -从专业到管理(1)——技术人才与的管理人才比较
目录 1从基层员工到基层管理 专业,专长,专能,受赏识,团结同事 2从 基层管理到中层管理 重点:一专多能, 打造团队, 获取资源,对外沟通 3从中层到高层 重点:战略规划, 选拔人才 , 市场扩展
- OpenCV教程【002 VideoCapture加载并播放视频】
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace c ...
- boost开发指南
C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...
- 数据处理之pandas库
1. Series对象 由于series对象很简单,跟数组类似,但多了一些额外的功能,偷个懒,用思维导图表示 2. DaraFrame对象 DataFrame将Series的使用场景由一维扩展到多维, ...
- AtCoder Petrozavodsk Contest 001 B - Two Arrays
Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement You are given two inte ...
- 在C#中实现截获shell程序的输出
在Windows环境下的所谓shell程序就是dos命令行程序,比如VC的CL.exe命令行编译器,JDK的javac编译器,启动java程序用的java.exe都是标准的shell程序.截获一个sh ...
- keepalived 检测脑裂切换脚本
#!/bin/bash count=0 run1=`curl -I 192.168.30.12:8000 | grep "200 OK" | wc -l` run2=`curl - ...
- IHE 官方网址有用资源介绍
实现标准: http://www.ihe.net/Technical_Frameworks/ 各个实现框架文档, 比如XDS,XCA,PIX,PDQ等 测试工具:http://www.ihe.net/ ...
- AllowsTransparency和WebBrowser兼容性问题解决方案
AllowsTransparency和System.Windows.Controls.WebBrowser兼容性问题,能看这篇文章,所以原因也不用多说:最根本的就是因为MS对win32底层的WebBr ...