使用drf的序列化类实现增删改查接口
什么是DRF
drf全称:django rest framework,它可以帮助我们快速的实现符合restful规范的接口。
安装DRF
pip3 install djangorestframework
# 注意:如果django版本过低,安装完drf后,会被重装为最新版本,此时,再手工重新安装django即可。
基于原生创建五个接口
- urls.py
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('api/v1/books/', views.BookView.as_view()),
path('api/v1/books/<int:pk>/', views.BookDetailView.as_view()),
]
- models.py
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32)
publish = models.CharField(max_length=32)
- views.py
from django import views
from app01 import models
from django.http import JsonResponse
# Create your views here.
class BookView(views.View):
def get(self, request):
# 查询出所有图书
books = models.Book.objects.all()
book_list = []
for book in books:
book_list.append({'name': book.name, 'price': book.price, 'publish': book.publish})
return JsonResponse(book_list, safe=False)
def post(self, request):
# 获取前端传入的数据
name = request.POST.get('name')
price = request.POST.get('price')
publish = request.POST.get('publish')
# 将数据写入到数据库
book = models.Book.objects.create(name=name, price=price, publish=publish)
# 返回给前端新增的对象
return JsonResponse({'name': book.name, 'price': book.price, 'publish': book.publish})
class BookDetailView(views.View):
# 查询一条数据
def get(self, request, pk):
book = models.Book.objects.filter(pk=pk).first()
return JsonResponse({'id': book.pk, 'name': book.name, 'price': book.price, 'publish': book.publish})
# 修改一条数据
def post(self, request, pk):
# 找到要修改的数据
book = models.Book.objects.filter(pk=pk).first()
# 获取前端传入的数据,进行修改
book.name = request.POST.get('name')
book.price = request.POST.get('price')
book.publish = request.POST.get('publish')
book.save()
# 返回给前端修改后的数据
return JsonResponse({'id': book.pk, 'name': book.name, 'price': book.price, 'publish': book.publish})
# 删除一条
def delete(self, request, pk):
book = models.Book.objects.filter(pk=pk).delete()
return JsonResponse(data='')
基于rest_framework的增删改查
查询多条数据
流程
- 需要在models.py创建测试使用的表
- 要使用rest_framework的serializers,需要先在应用中创建serializer.py(名字随意起),并在里面创建序列化类,有点类似于django的form组件。
- 在views中引入创建的serialzer中的序列化类,在创建类的时候使用
创建表
- models.py
# 创建表
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32)
publish = models.CharField(max_length=32)
创建序列化类
- serializer.py
from rest_framework import serializers
from app01 import models
class BookSerializer(serializers.Serializer):
# 序列化某些字段(内容写要序列化的字段)
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField()
创建视图类
- views.py
from app01 import models
from app01.serializer.serializer import BookSerializer
from rest_framework.views import APIView, Response
class BookView(APIView):
# 查询多条数据
def get(self, request):
books = models.Book.objects.all()
# instance是要序列化的对象 # many参数默认为None,如果返回结果是queryset,就需要指定many=True
ser = BookSerializer(instance=books, many=True)
return Response(ser.data)
增加路由
- urls.py
path('api/v1/books/', views.BookView.as_view()),
查询单条数据
序列化类不变
- serializer.py
from rest_framework import serializers
from app01 import models
class BookSerializer(serializers.Serializer):
# 序列化某些字段(内容写要序列化的字段)
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField()
视图类定义对象
- views.py
class BookDetailView(APIView):
# 序列化单条数据
def get(self, request, *args, **kwargs):
# 根据传入的数据,进行筛选
book = models.Book.objects.filter(pk=kwargs.get('pk')).first()
# 序列化
ser = BookSerializer(instance=book)
return Response(ser.data)
新增路由
- urls.py
path('api/v1/books/<int:pk>/', views.BookDetailView.as_view()),
新增一条数据
序列化类
- 新增一条数据,需要在序列化类中定义create方法
- serializer.py
class BookSerializer(serializers.Serializer):
# 序列化某些字段(内容写要序列化的字段)
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField()
# 新增一条数据,需要在序列化类中定义create方法
def create(self, validated_data):
book = models.Book.objects.create(**validated_data)
return book
视图类
- views.py
class BookView(APIView):
# 新增一条数据
def post(self, request):
# 把前端传入的要保存的数据,传给data参数
ser = BookSerializer(data=request.data)
# 校验数据
if ser.is_valid():
# 如果校验通过,则保存数据
# 如果要保存数据,需要在序列化类中增加create方法
ser.save()
return Response({'code': 100, 'msg': '新增成功', 'result': ser.data})
else:
return Response({'code': 101, 'msg': ser.errors})
修改一条数据
- 修改一条数据,需要在序列化类中定义update方法
- serializer.py
class BookSerializer(serializers.Serializer):
# 序列化某些字段(内容写要序列化的字段)
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField()
def update(self, instance, validated_data):
# instance是要修改的对象
# validated_data是校验过后的数据
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
instance.publish = validated_data.get('publish')
# 保存修改的数据
instance.save()
# 返回修改后的数据
return instance
视图类
- views.py
class BookDetailView(APIView):
# 反序列化 修改数据
def put(self, request, pk):
book = models.Book.objects.filter(pk=pk).first()
# 使用data接收前端传过来的数据,使用instance指定要修改哪个
ser = BookSerializer(data=request.data, instance=book)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': '修改成功', 'result': ser.data})
else:
return Response({'code': 101, 'msg': ser.errors})
删除一条数据
- 删除数据只需要在视图类中定义即可
- views.py
class BookDetailView(APIView):
def delete(self, request, pk):
models.Book.objects.filter(pk=pk).delete()
return Response({'code': 100, 'msg': '删除成功'})
序列化之钩子函数校验
局部钩子
- 需要导入ValidationError方法
- 只需要定义以 “validate_字段名” 命名的函数即可,如下
from rest_framework import serializers
from app01 import models
from rest_framework.exceptions import ValidationError
class BookSerializer(serializers.Serializer):
# 序列化某些字段(内容写要序列化的字段)
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField()
def create(self, validated_data):
book = models.Book.objects.create(**validated_data)
return book
def update(self, instance, validated_data):
# instance是要修改的对象
# validated_data是校验过后的数据
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
instance.publish = validated_data.get('publish')
# 保存修改的数据
instance.save()
# 返回修改后的数据
return instance
# 局部钩子
def validate_name(self, name):
# 校验name是否合法,比如name不能等于123
if name == '123':
# 校验不合法,直接抛异常
raise ValidationError('不可以为123')
else:
return name
报错如下:

全局钩子
- 全局钩子只需要定义validate函数即可,如下
from rest_framework import serializers
from app01 import models
from rest_framework.exceptions import ValidationError
class BookSerializer(serializers.Serializer):
# 序列化某些字段(内容写要序列化的字段)
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField()
def create(self, validated_data):
book = models.Book.objects.create(**validated_data)
return book
def update(self, instance, validated_data):
# instance是要修改的对象
# validated_data是校验过后的数据
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
instance.publish = validated_data.get('publish')
# 保存修改的数据
instance.save()
# 返回修改后的数据
return instance
# 局部钩子
def validate_name(self, name):
# 校验name是否合法,比如name不能等于123
if name == '123':
# 校验不合法
raise ValidationError('不可以为123')
else:
return name
# 全局钩子
def validate(self, attrs):
# 校验数据,出版社不能为“我是出版社”
if attrs.get('publish') == '我是出版社':
raise ValidationError('出版社不可以为“我是出版社”')
else:
return attrs
报错如下:

使用drf的序列化类实现增删改查接口的更多相关文章
- 如何用tep完成增删改查接口自动化
tep的设计理念是让人人都可以用Python写自动化,本文就来介绍如何用tep完成增删改查接口自动化. 环境变量 编辑fixtures/fixture_admin.py: "qa" ...
- 用泛型创建SqlServerHelper类实现增删改查(一)
使用泛型,可以构建对数据库单表的基本增删改查. 首先有一数据库 Test_SqlServerHelper ,有2表 接下来创建项目,对数据库进行增删改查. 直接贴代码:(SqlServerHelper ...
- Day 18 :面向对象[基础,继承,组合]类的增删改查
有的人说,编程有3种范式: 1.面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 2.面向函数:面向函数是面向过程的升级版,也就是把每个 ...
- Django基于类的增删改查,简单逻辑都不用写
Django是Python中一个非常牛逼的web框架,他帮我们做了很多事,里边也提前封装了很多牛逼的功能,用起来简直不要太爽,在写网站的过程中,增删改查这几个基本的功能我们是经常会用到,Django把 ...
- StringBuffer类(增删改查及长度可变原理)
1 package cn.itcast.p2.stringbuffer.demo; 2 3 public class StringBufferDemo { 4 5 public static void ...
- Ado.net中简单的DBHelper类(增删改查)
private static string connString = "server=.;database=hotel;uid=aa;pwd=123";//最好从配置文件中取出 p ...
- 针对MySql封装的JDBC通用框架类(包含增删改查、JavaBean反射原理)
package com.DBUtils; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.Dri ...
- 抽取JDBC工具类并增删改查
抽取工具类: package demo; /* * 工具类 */ import java.sql.Connection; import java.sql.DriverManager; import j ...
- 使用Spring Data Mongodb的MongoRepository类进行增删改查
Spring Data Mongodb提供一套快捷操作 mongodb的方法,创建Dao,继承MongoRepository,并指定实体类型和主键类型. public interface CmsPag ...
- JAVA 增删改查接口命名规范(dao层与 service 层
开发时,有很多规范,这里写的是命名规范. Dao 接口命名 insert batchInsert selectOne selectById count selectList update dele ...
随机推荐
- 获取客户端ip,请求头伪造ip,解决办法
可以在请求头加入 X-Forwarder-For 来伪造访问的ip地址 //Nginx支持X-Forwarded-For 配置 proxy_set_header X-Forwarded-For $pr ...
- jmeter&badboy安装
一.jmeter下载地址: 1. http://jmeter.apache.org/download_jmeter.cgi \ https://www.apache.org/dist/jmete ...
- NOIP2013普及组
T1]记数问题 试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?例如,在1到11 中,即在1.2.3.4.5.6.7.8.9.10.11中,数字1 出现了4 次. 其实 ...
- Redis5.0.4-集群(单机版)搭建
最近尝试搭建了一下redis集群,这里记录一下,最后附上的是参考的博客地址. 安装C语言编译环境GCC yum install -y gcc-c++ 下载redis并编译安装 下载: wget htt ...
- IT工具知识-11:一种安卓投屏到Win10失败的解决方法
软硬件平台 电脑:WIN10 LTSC 手机:红米K30Pro/MIUI 11.0.26 投屏软件:安卓端-自带投屏,WIN10-自带投屏(连接) 故障描述 之前还能用的,但是在换了个路由器之后就不能 ...
- 任意的形如 z = F(x,y)的曲面生成与显示---基于OpenGL Core Profile
运行结果: (圆锥面) (抛物面) (马鞍面) 其中的做法是:从顶部看上去就是一个平面网格.每个点的 z.x的位置都是程序细分出来的(指定起始.结束.步长).比较固定.但高度 y 的计算使用 用户 ...
- C#学习之详解C#Break ,Continue, Return
C#编程语法中break ,continue, return这三个常用的关键字的学习对于我们编程开发是十分有用的,那么本文就向你介绍break ,continue, return具体的语法规范. C# ...
- Ubuntu解决无法远程连接
检查SSH是否安装 ssh localhost 如果没有安装,通过APT的命令安装 sudo apt install openssh-server 无法连接Ubuntu中的root用户 其他用户可以连 ...
- listener.log/listener_scan1.log监听日志太大清理
listener_scan1.log清理lsnrctlset current_listener listener_scan1show log_statusset log_status offcd /u ...
- C#重点语法——特性
特性的基本理解 ************************************************************************************* 一.含义 特 ...