RestFramework之序列化组件
一、restframework的序列化组件的使用
1.导入序列化组件与模型类
from rest_framework import serializers
from app01.models import (
Book,
Author,
Publish
)
2.书写序列化类
# 创建一个序列化类 class BookSerializer(serializers.Serializer):
'''
开始使用序列化
- 导入模块:from rest_framework import serializers
- 建立一个序列化类
class BookSerializer(serializers.Serializer):
字段可以自定义
- 获取queryset
origin_data = Book.objects.all()
- 开始序列化
serialized_data = BookSerializer(origin_data, many=True)
- 获取序列化后的数据,返回给客户端
return Response(serialized_data.data)
'''
title = serializers.CharField(max_length=32)
price = serializers.DecimalField(max_digits=5,decimal_places=2)
publish = serializers.CharField(max_length=32) # 多对多字段需要自己手动获取数据,SerializerMethodField()
author_list = serializers.SerializerMethodField() def get_author_list(self,obj):
'''
处理多对多关系
:param obj: Book对象
:return:
'''
#定义作者列表对象
author_list =list()
# print(obj.authors.all())
for author in obj.authors.all():
author_list.append(author.name)
return author_list def create(self, validated_data):
# {'title': 'Python666', 'price': Decimal('66.00'), 'publish': '2'}
validated_data['publish_id'] = validated_data.pop('publish') book = Book.objects.create(**validated_data) return book
# 基于ModelSerializer书写的序列化类
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
extra_kwargs={
'publish':{'write_only':True},
'authors':{'write_only':True}
}
publish_name = serializers.CharField(max_length=32,source='publish.name',read_only=True)
publish_place = serializers.CharField(max_length=32,source='publish.place',read_only=True) author_list = serializers.SerializerMethodField() def get_author_list(self,obj):
author_list=[]
for author in obj.authors.all():
author_list.append(
author.name
)
return author_list
3.视图中的用法
首先也是要导入restframework中封装view的APIview与响应方式
from rest_framework.views import APIView
from rest_framework.response import Response
然后书写视图类
class BookListView(APIView):
# 获取全部
def get(self,request):
'''
1.获取queryset对象
2.开始序列化,给序列化类传值(quertset)
3.返回Response(.data)
:param request:
:return:
'''
data = Book.objects.all()
serializer_data = BookSerializer(data,many=True)
return Response(serializer_data.data)
# 添加
def post(self,request):
bs = BookSerializer(data=request.data)
print(bs)
if bs.is_valid():
book = bs.save()
authors = Author.objects.filter(id__in=request.data['authors'])
book.authors.add(*authors)
return Response(bs.data)
else:
return Response(bs.errors) class BookFileView(APIView):
# 获取一条
def get(self,request,pk):
book_obj = Book.objects.get(pk=pk)
bs = BookSerializer(book_obj ,many=False)
return Response(bs.data)
# 修改
def put(self,request,pk):
book_obj = BookSerializer(pk=pk)
bs = BookSerializer(data=request.data,instance=book_obj)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors)
# 删除
def delete(self,request,pk):
Book.objects.get(pk=pk).delete()
return Response('Delete operation successfully')
RestFramework之序列化组件的更多相关文章
- rest-framework之序列化组件
一:django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers def test(re ...
- Django的restframework的序列化组件之对单条数据的处理
之前我们学习的都是处理书籍或者出版社的所有的数据的方法,下面我们来看下处理单个书籍,或者单个出版社的方法 这个时候我们就需要重新写一个类,这个类的方法,就需要有3个参数,参数1是self,参数2是re ...
- rest-framework之APIView 序列化组件
rest-framework之APIView 一 安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面 ...
- day 94 RestFramework序列化组件与视图view
一 .复习 1. CBV流程 class BookView(View): def get(): pass def post(): pass #url(r'^books/', views.BookVie ...
- rest-framework框架——APIView和序列化组件
一.快速实例 Quickstart http://www.cnblogs.com/yuanchenqi/articles/8719520.html restful协议 ---- 一切皆是资源,操作只是 ...
- drf 之序列化组件
序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...
- python全栈开发day99-DRF序列化组件
1.解释器组件源码分析 https://www.processon.com/view/link/5ba0a8e7e4b0534c9be0c968 2.基于CBV的接口设计 1).django循环que ...
- Restful framework【第三篇】序列化组件
基本使用 -序列化 -对象,转成json格式 用drf的序列化组件 -定义一个类继承class BookSerializer(serializers.Serializer): -写字段,如果不指定so ...
- 解析器组件和序列化组件(GET / POST 接口设计)
前言 我们知道,Django无法处理 application/json 协议请求的数据,即,如果用户通application/json协议发送请求数据到达Django服务器,我们通过request.P ...
随机推荐
- log4net示例2-日志输入存入Access(转)
需求:基于log4net组建,创建Console程序将日志输出到Access数据库. 具体实施: (1)创建控制台程序. (2)控制台程序中,添加一个纯文本文件,文件命名为“log-Access.se ...
- e.target 和 e.currentTarget
们可以得出: e.currentTarget指的是注册了事件监听器的对象,而e.target指的是该对象里的子对象,也是触发这个事件的对象!这么说应该明白 了吧?
- jqweui Popup 使用说明
使用步骤说明: 今天遇到一个问题,无论怎么点击一个图标都不会弹出对应的遮罩层,但是把示列代码拷贝过来又可以正常显示:结果是由于在复制的时候把 # 号弄掉了 错误操作展示: <a href=&qu ...
- @media 适配兼容
/* 兼容iphone4/4s */ @media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){ } /* 兼容iphon ...
- 第七章 云原生生态的基石 Kubernetes
7.1 Kubernetes架构 K8s的核心组件: etcd: 协同存储,负责保存整个集群的状态. API:资源操作的唯一入口. controller manager: 维护集群的状态,执行故障检测 ...
- 【C/C++开发】malloc,calloc和realloc的区别和注意事项
(1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量. <2&g ...
- element组件 MessageBox不能显示确认和取消按钮,记录正确使用方法!
这里是局部引入 调用方式:
- Linux题库练习
转一个Linux的题库供自己学习使用(滑稽) 转自:http://www.linuxdiyf.com/view_202485.html 选择题1 在终端下输入mount -a命令的作用是:CA 强制进 ...
- Mybatis笔记2
使用Mybatis完成的CRUD操作 个人总结的一些小规律 学习过程中碰到的错误: org.apache.ibatis.exceptions.PersistenceException: ### Err ...
- PAT(B) 1028 人口普查(C)字符串
题目链接:1028 人口普查 (20 point(s)) 题目描述 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是 ...