浏览目录

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组件 之 序列化的更多相关文章

  1. 解析器组件和序列化组件(GET / POST 接口设计)

    前言 我们知道,Django无法处理 application/json 协议请求的数据,即,如果用户通application/json协议发送请求数据到达Django服务器,我们通过request.P ...

  2. Spring Framework 组件注册 之 @Import

    Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可 ...

  3. Spring Framework 组件注册 之 @Component

    Spring Framework 组件注册 之 @Component 写在前面 在spring大行其道的今天,对于spring的使用和掌握乃是不可缺少的必备技能.但是spring的整个体系尤为庞大,对 ...

  4. Spring Framework 组件注册 之 FactoryBean

    Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...

  5. 【转载】C#使用Newtonsoft.Json组件来序列化对象

    在Asp.Net网站开发的过程中,很多时候会遇到对象的序列化和反序列化操作,Newtonsoft.Json组件是专门用来序列化和反序列化操作的一个功能组件,引入这个DLL组件后,就可使用JsonCon ...

  6. 基于Django的Rest Framework框架的序列化组件

    本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...

  7. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化

    一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...

  8. 安装.NET Framework组件时,电脑意外重启后再次安装失败

    因为软件运行环境需要安装.Net Framework,我安装的是2.0sp版本,可以安装过程中计算机意外关闭,重新打开后再次安装却出现安装失败的提示,具体内容是: 产品: Microsoft .NET ...

  9. python-django rest framework框架之序列化

    序列化与反序列化: 对象 -> 字符串 序列化 字符串 -> 对象 反序列化 rest framework序列化+Form 目的: 解决QuerySet序列化问题 功能:解析 和 过滤 - ...

  10. [Learn AF3]第四章 App framework组件之Button

    Button    组件名称:Button     是否js控件:否     使用说明:如果说panel组件是af3的“核心(heart of the ui)”,那么Button就是af中的五虎上将之 ...

随机推荐

  1. PHP文件管理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Codeforces Round #281 (Div. 2) A. Vasya and Football(模拟)

    简单题,却犯了两个错误导致WA了多次. 第一是程序容错性不好,没有考虑到输入数据中可能给实际已经罚下场的人再来牌,这种情况在system测试数据里是有的... 二是chronologically这个词 ...

  3. POJ2985 The k-th Largest Group (并查集+treap)

    Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is ...

  4. C#进阶之路(一):委托

    一.什么是委托 简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度更小的“接口”(约束了指向方法的签名). 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方 ...

  5. CentOS6.5 下MySQL傻瓜式安装

    为了为服务器上装mysql我先在虚拟机上练习了一下特此记录并分享; 注:参考文章https://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/ ...

  6. WPF案例:如何设计搜索框(自定义控件的原则和方法)

    我们平时自定义WPF控件的方法有:Style,DataTemplate,ControlTemplate, DependencyProperty, CustomControl等几个方法. 按照优先顺序应 ...

  7. Chroma Oracle 安装宝典,吐血整理

    尼玛,太坑爹!安装: 1.Chroma Application Service 2. PL SQL 安装Oracle 11g 的步骤和过程: 第一步:只能安装 Oracle 11g 64 bit 数据 ...

  8. 寻找php.ini之旅

    /usr/local/php-fpm/lib/php.ini 可以通过phpinfo()来查看 https://www.cnblogs.com/ChineseMoonGod/p/6474772.htm ...

  9. (二 )结构ztree的 ajax交互的简单使用

    在第一篇的基础上更改,在实际项目中的使用. 一:HTML 代码: <SCRIPT type="text/javascript"> var setting = { asy ...

  10. Python:常用正则表达式(一)

    文章转载于:http://www.cnblogs.com/Akeke/(博主:Akeke) https://www.cnblogs.com/Akeke/p/6649589.html (基于JavaSc ...