Django-rest-framework 接口实现 Serializer 使用
Django接口实现 DRF
使用 以下模块 实现 json数据 序列化
博客: https://www.cnblogs.com/liwenzhou/p/9959979.html
Django REST Framework
查看全局的 DRF 配置: rest_framework.settings
- 基于Django开发RESTful API的一个框架
- django 中使用
安装模块
pip install djangorestframework使用的时候
使用
rest_framework这个名字
Serializer 使用
- 以图书管理为基础 操作
- Books 图书
- Author 作者
- Publisher 出版社
注册APP
'rest_framework',不是必须的 需要好看的界面 就注册在views 视图中 使用
CBV写法:
导入APIView
from rest_framewor.views import APIView, CBV继承它响应对象 使用 rest_framework 中的 响应 Response
from rest_framework.response import Response在app中 创建一个 serializers 的 py文件 创建 序列化工具类 并将其导入 用法 跟Form 基本类似
from interface.serializers import BooksSerializer
CBV视图中注意事项:
写上类注释 会在 chream 浏览器中 提示 相当于 文档提示
实例化的 serializer 对象 接收 参数
BooksModelSerializer(query_set_list, many=True)BooksSerializer(instance=book_obj)BooksSerializer(instance=book_obj, data=request.data, partial=False)queryset对象直接放在第一个位置 交给 工具序列化
many=True需要有多个会循环读取instance 需要单个的书籍对象 data=需要校验的数据
partial=False可以对单个值进行修改返回的 数据
ser_obj.data就是序列化的 json 数据 APIView 包装的 数据 直接用 Reaponse 返回提交修改的数据put数据
request.data路由上携带的 参数
request.query_paramsrequest 不是之前的 request 对象
self._requrst才是之前的 request使用
res_obj.save()需要在 serializer 中 重写 create() 方法修改数据时 错误信息 是
ser_obj.errors直接返回
class BooksList(APIView):
''' books书籍 接口 :支持查询所有书籍 GET请求 添加书籍 POST请求 '''
def get(self, request):
'''获取所有的书籍'''
query_set_list = models.Books.objects.all()
ser_obj = BooksModelSerializer(query_set_list, many=True)
return Response(ser_obj.data) def post(self, request):
# 将 数据交给 serializer books序列化的 工具进行效验
ser_obj = BooksSerializer(data=request.data)
print(request.data)
if ser_obj.is_valid():
# serializer 中 调用 save() 方法 需要 重写 create() 方法
ser_obj.save()
return Response('ok')
else:
return Response(ser_obj.errors) class BookDetails(APIView):
''' 单本书籍的操作 支持 GET/PUT/DELETE '''
def get(self, request, pk):
'''单本书籍的查询'''
book_obj = models.Books.objects.filter(pk=pk).first()
if book_obj:
ser_obj = BooksSerializer(instance=book_obj)
return Response(ser_obj.data) def put(self, request, pk):
'''单本书籍的修改'''
book_obj = models.Books.objects.filter(pk=pk).first()
if book_obj:
# partial=True 可以局部更新
ser_obj = BooksSerializer(instance=book_obj, data=request.data, partial=False)
if ser_obj.is_valid():
ser_obj.save() # 调用 类中的update() 方法
return Response(ser_obj.data)
else:
return Response(ser_obj.errors) def delete(self, request, pk):
'''删除某一本书籍'''
book_queryset = models.Books.objects.filter(pk=pk)
if book_queryset:
book_queryset.delete()
return Response('删除成功!!')自己写一个序列化的工具类
BookSerializer工具类写法:
导入 serializers
from rest_framework import serializers创建类 继承
serializers.Serializer填写 需要序列化的 字段
重写
create(self,validated_data)方法 以及update(self, instance, validated_data):方法validates_date 就是通过校验的数据 instance 是 单个的 数据对象
局部钩子
def validate_字段名(self, attrs):全局钩子 :def validate(self, attrs):
注意事项:
- id字段 需要填写 参数
required=False修改此字段在新建数据时不是必须的 可以不写 - 字段名要跟models 中的字段名对应
- 字段参数使用 serializers.字段类型 进行设置 参数填写 max_length=32...等参数进行效验
特殊字段的 显示
- 写两个字段 一个用来读取 一个用来添加 使用
read_only=True和write_only=True区分
choices 显示
参数
cource='get_字段名_display'来显示具体对应的 内容ForeignKey 显示
自定义一个对应的 外键 序列化类 进行显示
ManTOMan 字段显示
多个内容 使用 many=true 的参数 来取多个值 同样创建一个字段对应的序列化类
写入效验的 字段 变量面前需要加 post_字段名来区分 写入时字段名要对应
create() 中就是 orm 操作
validated_data就是通过效验的数据注意字段中存的 具体数据类型
需要返回 创建好的 obj 的对象
update() 中也是 orm 操作
instance就是要修改的 单本书的数据validated_data通过校验的数据需要返回 instence
钩子中 不通过效验 需要抛出 serializers 中的 ValidationError
raise serializers.ValidationError('不通过效验 就抛出异常')
'''
这是一个 Django rest framework 的 json 序列化的 工具
'''
from rest_framework import serializers
from interface import models
class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False)
name = serializers.CharField(max_length=32)
class PublisherSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False)
name = serializers.CharField(max_length=32)
class BooksSerializer(serializers.Serializer):
# 普通字段的 显示
id = serializers.IntegerField(required=False)
# validators 自定义效验规则
title = serializers.CharField(max_length=32,validators=[func])
pub_date = serializers.DateField(required=False)
# choices 字段 特殊显示
booksType = serializers.CharField(source='get_booksType_display', read_only=True)
post_booksType = serializers.IntegerField(write_only=True)
# ForeignKey 字段特殊显示
publisher = PublisherSerializer(read_only=True)
post_publisher = serializers.IntegerField(write_only=True)
# ManyToManyField 字段特殊显示
authors = AuthorSerializer(many=True, read_only=True)
post_authors = serializers.ListField(write_only=True)
def validate(self, attrs):
'''全局 校验 '''
return attrs
def validate_title(self, attrs):
''' 单一字段的校验 '''
if "av" in attrs:
raise serializers.ValidationError('不通过效验 就抛出异常')
return attrs
# 行内校验:
# 自定义函数 给出字段参数 validators=[func]
def create(self, validated_data):
'''重写 create() 方法 使用 save() 方法 写入数据库'''
# validated_data 就是通过效验的数据
print(validated_data)
# 正常字段 以及外键的创建
book_obj = models.Books.objects.create(
title=validated_data['title'],
booksType=validated_data['post_booksType'],
publisher_id=validated_data['post_publisher'],
)
# 多对多的创建
book_obj.authors.set(validated_data['post_authors'])
return book_obj
def update(self, instance, validated_data):
# print(instance) # 要更新的 book 对象
# print(validated_data) # 通过校验的数据
instance.title = validated_data.get('title', instance.title)
instance.booksType = validated_data.get('post_booksType', instance.booksType)
instance.publisher_id = validated_data.get('post_publisher', instance.publisher_id)
# 将表内的数据存入数据库中
instance.save()
# 修改 多对多字段
instance.authors.set(validated_data.get('post_authors', [i['id'] for i in instance.authors.all().values('id')]))
return instance
在视图中 使用queryset数据实例化得到一个 序列化对象 --》 ser_obj 并返回数据
ser_obj = BooksSerializer(instance=book_obj)
return Response(ser_obj.data)
Django-rest-framework 接口实现 Serializer 使用的更多相关文章
- Django REST Framework 学习笔记
前言: 基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无 ...
- Django REST framework的使用简单介绍
官方文档:https://www.django-rest-framework.org/ GitHub源码:https://github.com/encode/django-rest-framework ...
- [Django REST framework - 序列化组件、source、钩子函数]
[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...
- Django Rest framework基础使用之 serializer
rest-framework文档地址:http://www.django-rest-framework.org/ Django Rest framework是一个非常强大且灵活的工具包,用于构建web ...
- Django Rest Framework Serializer的简单使用
1.RESTful 1.1 定义 REST(Representational State Transfer)与技术无关,代表一种软件架构风格,中文为表征状态转移. 1.2 RESTful API设计 ...
- day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能
目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...
- [Django REST framework - 自动生成接口文档、分页]
[Django REST framework - 自动生成接口文档.分页] 自动生成接口文档 # 后端人员写好接口,编写接口文档,给前端人员看,前端人员依照接口文档开发 # 公司里主流 -后端,使用w ...
- Django REST framework serializer 嵌套显示绝对路径
在 Django REST framework官方文档提到,当调用Serializer时,应当传入request参数,以便生成完整的url而不是相对url.使用ModelSerializer时requ ...
- Django REST Framework(一) Serializer和ModelSerializer
REST Framework概述 Django REST framework是一套基于Django的REST框架,是一个用于构建Web API的功能强大且灵活的工具包. 1.RESTful 简述Rep ...
- Django REST framework 的TokenAuth认证及外键Serializer基本实现
一,Models.py中,ForeignKey记得要有related_name属性,已实现关联对象反向引用. app_name = models.ForeignKey("cmdb.App&q ...
随机推荐
- linux磁盘管理增加,扩容
一.磁盘空间不足,添加新的磁盘 一般来说,当我们在服务上插入新的磁盘时,服务器是会对磁盘进行识别的.但是,有的时候服务器并没有对这些新插入的磁盘进行识别.这时,我们可以通过重启服务器,来使服务器重新加 ...
- 从零开始学安全(二十一)●PHPSPL异常
- Entity Framework Code first(转载)
一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...
- python多任务-线程
目录 多任务的概念 线程基础 单线程执行 多线程执行 主线程会等待所有子线程结束后才结束 查看线程数量 线程-注意点 线程执行代码的封装 线程的执行顺序 总结 多任务的概念 什么叫"多任务& ...
- 【Java并发编程】23、ConcurrentHashMap原理分析(1.7和1.8版本对比)
jdk 1.8版本 ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了.首先,取消了Segment分段锁的数据结构,取而代之的是数组+链表(红黑树)的结构.而对于 ...
- js 正则表达式之环视结构
一.环视 1:环视不“占用”字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正 ...
- 关于RecyclerView你知道的不知道的都在这了(下)
目录 目录 正文 6. Recycler 7. ItemAnimator 8. ItemDecoration 9. OnFlingListener 目录 由于本篇篇幅特长,特意做了个目录,让大伙对本篇 ...
- Ios12怎么投屏到电脑 苹果手机投屏电脑的方法
苹果手机是一款外观精致时尚的手机,吸引这许多用户争先恐后的购买,然后苹果手机的系统不同于我们传统使用的安卓系统,它采用的是苹果自主研发的IOS系统,有许多操作与安卓手机不同,那么苹果手机怎么用呢?下面 ...
- 【极简】如何挑选合适的百度BCC,并安装宝塔控制面板
1.前期有百度云账号,登陆系统控制台,点击产品"云服务器BCC". 2.关闭绑定快照策略,选择购买弹性公网IP,如果选择不需要,服务器就没有对外的IP,只能在内网内使用,所以这里要 ...
- Salesforce 的 package.xml 文件
package.xml文件 在部署元数据(Metadata)的时候,package.xml是很关键的一个文件.此文件中定义了一个XML格式的列表,其中包含了各个元数据组件的定义. Metadata A ...