rest-framework框架之序列化
rest-framework框架之序列化
开发 API 接口最重要的工作就是将代码片段的输出序列化和反序列化为类似于 json 的表示形式。
在 rest-framework 中,通过声明与 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
使用 Serializer
Serializer 的学习可以类比 Django 中的 form 。它们都有 CharField ,IntegerField 等。
数据表中的普通字段用 CharField ,IntegerField 等,一对多用 CharField ,里面加上 source 指向要对应的字段。多对多用 SerializerMethodField ,并且自定义一个名为 get_多对多字段名
的函数,此时该多对多字段的值取决于这个函数的返回值。
from app01.models import *
from rest_framework import serializers
class BookSerializers(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.IntegerField()
pub_date = serializers.DateField()
# 一对多用CharField,里面加上source
publish = serializers.CharField(source="publish.name")
# 多对多用SerializerMethodField
authors = serializers.SerializerMethodField()
# 此时authors值取决于下面函数的返回值
def get_authors(self, obj):
authors_temp = []
for authors_obj in obj.authors.all():
authors_temp.append(authors_obj.name)
return ",".join(authors_temp)
使用 ModelSerializer
ModelSerializer 可以类比成 Django 中的 ModelForm 它实现的功能与 Serializer 一样,只是代码量更少,功能更多。
普通字段
通过 Meta 类将普通字段转成 Serializer 类中的各种字段。其中, model 绑定的数据表模型,fields 绑定要转化的字段,"__all__" 表示要将所有字段都转成相应的类型。
class PublishModelSerializers(serializers.ModelSerializer):
class Meta:
model = Publish
fields = "__all__"
特殊字段
特殊字段可以自己添加,和 Serializer 一样,一对多字段用 CharField,里面加上 source ,多对多用 SerializerMethodField ,特殊字段依然可以用 get_字段名
来返回该字段的值。
注意:存在定制字段,需要改写 create 方法。
class BookModelSerializers(serializers.ModelSerializer):
# 默认将普通字段转化
class Meta:
model = Book
fields = "__all__"
# 特殊字段可以自己添加
# 一对多用CharField,里面加上source
publish = serializers.CharField(source="publish.name")
publish = serializers.CharField(source="publish.pk")
# 多对多用SerializerMethodField
authors = serializers.SerializerMethodField()
# 此时authors值取决于下面函数的返回值
def get_authors(self, obj):
authors_temp = []
for authors_obj in obj.authors.all():
authors_temp.append(authors_obj.name)
return ",".join(authors_temp)
# 存在定制字段,所以要改写create方法
# def create(self, validated_data):
# print("validated_data", validated_data)
# book_obj = Book.objects.create(title=validated_data["title"], price=validated_data["price"], pub_date=validated_data["pub_date"], publish_id=validated_data["publish"]["pk"])
# book_obj.authors.add(*validated_data["authors"])
#
# return book_obj
视图部分
需要用到 rest-framework 中的 APIView 类。
对每个数据表模型建立相应的视图类,并在视图类中通过不同的方法来接受前端以不同方法发来的数据。
from rest_framework.views import APIView
from .serializer import *
# Create your views here.
class BookViewSet(APIView):
def get(self, request, *args, **kwargs):
...
def post(self, request, *args, **kwargs):
...
def put(self, request, *args, **kwargs):
...
def patch(self, request, *args, **kwargs):
...
序列化方法一
使用 Django 中的 model_to_dict 。
book_list = Book.objects.all()
from django.forms.models import model_to_dict
import json
data = []
for obj in book_list:
data.append(model_to_dict(obj))
return HttpResponse(json.dumps(data))
序列化方法二
使用 Serializer 将数据转成 json 数据。
data = serializers.serialize("json", book_list)
return HttpResponse(data)
序列化方法三
直接通过 Serializer 或者 ModelSerializer 来返回。
bs = BookSerializers(book_list, many=True)
bs = BookModelSerializers(book_list, many=True)
# 超链接时需要增加参数
bs = BookModelSerializers(book_list, many=True, context={'request': request})
return Response(bs.data)
提交 post 请求
与 Django 中的 ModelForm 类似,ModelSerializer 也有 is_valid 函数来判断验证是否通过, save 函数来讲数据保存到数据库中。
def post(self, request, *args, **kwargs):
bs = BookSerializers(data=request.data, many=False)
request.data:post的数据
bs = BookModelSerializers(data=request.data, many=False)
# 超链接时需要增加参数
bs = BookModelSerializers(data=request.data, many=False, context={'request': request})
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)
单条数据的请求
单条数据与之前的区别在于多传过来一个单条数据的 ID ,通过该 ID 值进行筛选工作。
class PublishViewSet(APIView):
def get(self, request, *args, **kwargs):
publish_list = Publish.objects.all()
ps = PublishModelSerializers(publish_list, many=True)
return Response(ps.data)
def post(self, request):
ps = PublishModelSerializers(data=request.data, many=False)
if ps.is_valid():
print(ps.validated_data)
ps.save()
return Response(ps.data)
else:
return Response(ps.error)
超链接 API
有时,想让该字段的输出值为超链接,这样也是可以实现的。需要将该字段设置为
HyperlinkedIdentityField 类型,其中 view_name 为在 urls.py 中设置的视图名, lookup_field 绑定数据表模型的 ID , lookup_url_kwarg 绑定为主键。
class BookModelSerializers(serializers.ModelSerializer):
# 默认将普通字段转化
class Meta:
model = Book
fields = "__all__"
# 定制url
publish = serializers.HyperlinkedIdentityField(
view_name="detailpublish",
lookup_field="publish_id",
lookup_url_kwarg="pk"
)
而包含超链接的字段进行实例化时,需要添加相应的参数:
bs = BookModelSerializers(book_list, many=True, context={'request': request})
urls 部分
对于视图类,只需要在 URL 中调用 as_view 函数即可。
注意:
- 整体数据和单条数据的操作不能用同一个视图类。
- 如果有超链接,需要给每个 URL 都加上 name 属性。
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/$', views.BookViewSet.as_view(), name="book"),
url(r'^publishes/$', views.PublishViewSet.as_view(), name="publish"),
url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(), name="detailpublish"),
url(r'^authors/$', views.AuthorViewSet.as_view(), name="author"),
url(r'^books/(\d+)/$', views.BookDetailView.as_view(), name="detailbook"),
]
rest-framework框架之序列化的更多相关文章
- python-django rest framework框架之序列化
序列化与反序列化: 对象 -> 字符串 序列化 字符串 -> 对象 反序列化 rest framework序列化+Form 目的: 解决QuerySet序列化问题 功能:解析 和 过滤 - ...
- 基于Django的Rest Framework框架的序列化组件
本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...
- Django_rest framework 框架介绍
restful介绍 restful协议 一切皆是资源,操作只是请求方式 URL 设计 原先的URL设计方式 在url 中体现出操作行为 /books/ books /books/add/ addbo ...
- Django之Rest Framework框架
一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...
- Django----Rest Framework框架
Django Rest Framework框架(10) - RESTful规范 1.API与用户的通信协议,总是使用HTTPs协议. 2.域名 https://api.example.com 尽量将A ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝
web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...
- DRF框架之序列化器初体验
首先,我们需要明白序列化和反序列化的过程指的是什么. 序列化操作:将模型数据 ---> 字典数据 --->JSON数据(响应JSON数据的操作) 反序列化操作:将JSON数据 ---> ...
- .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系
.Net 包含两部分 .Net平台 和.Net FrameWork 框架 1..Net FrameWork框架包含于.Net平台. .Net FrameWork提供环境和支撑保证.Net平台运行. 2 ...
- Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
- Play Framework框架 JPA惯用注解
Play Framework框架 JPA常用注解 1.@Entity(name=”EntityName”) 必须 ,name 为可选 , 对应数据库中一的个表 2.@Table(name=”" ...
随机推荐
- python子进程模块subprocess详解与应用实例 之三
二.应用实例解析 2.1 subprocess模块的使用 1. subprocess.call >>> subprocess.call(["ls", " ...
- 用TCGA数据库分析癌症和癌旁组织的表达差异
上周收到一条求助信息:“如何用TCGA数据库分析LINC00152在卵巢癌与正常组织的的表达差异?” 所以以这个题目为记录分析过程如下: 一.下载数据 a)进入网站https://cancergeno ...
- up6-chrome 45+安装教程
up6-Chrome 45+安装说明 说明:只需要安装up6.exe即可,up6.exe为插件集成安装包. 1.以管理员身份运行up6.exe.up6.exe中已经集成Chrome 45插件.
- (转)使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工管理源码分享
原文地址:http://www.cnblogs.com/huyong/p/3334848.html 在开始讲解之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于 ...
- 编写高质量代码改善C#程序的157个建议——建议48:Dispose方法应允许被多次调用
建议48:Dispose方法应允许被多次调用 一个类型的Dispose方法应该允许被多次调用而不抛出异常.鉴于此,类型内部维护了一个私有的bool变量disposed,如下: private bool ...
- 浅谈delphi创建Windows服务程序与窗体实现交互
我想实现的功能是创建一个服务程序,然后在服务Start时动态创建一个窗体Form,然后把Form缩小时变成TrayIcon放在Windows托盘上. 我在服务程序的OnStart事件中写到 Start ...
- WebApi跨域问题解决
因为第一次用webapi,并且还是前后台分离,所以设置到了跨域,在百度上找了很多解决办法,但是基本都存在缺陷,我这里分享一下我自己的经验 1.首先配置Web.config 这样配置发布到服务器就可以跨 ...
- Ext.Net安装和应用
1.最新版本 2.打开文件,将包含以下文件: Ext.Net.dll Ext.Net.Utilities.dll Ext.Net.xml Newtonsoft.Json.dll Newto ...
- C# 高斯消元项目运用
C# 高斯消元项目运用 最近项目涉及到一个需求,需要把指定数量的多个商品,混合装入到多个不同型号的箱子中(每种型号的箱子装入商品的种类和个数是固定的).这就涉及到解多元一次方程 针对多元一次方程一般用 ...
- 如何优雅地使用win10的Linux子系统
转自: http://blog.csdn.net/u010053050/article/details/52388663 http://www.rehack.cn/techshare/devtools ...