一、视图层代码

"""
基于APIView实现接口的编写
用的是同一个模型表
路由也没变
这次做了解耦合
写了序列化类 与视图类分开了
""" from rest_framework.views import APIView
from .models import Book
from .serializer import BookSeSerializer
from rest_framework.response import Response class BookView(APIView):
def get(self, request): # 查所有数据
# 先查出来数据
books = Book.objects.all()
# instance是要序列化的数据 是queryset对象 ,因此要传many=True
ser = BookSeSerializer(instance=books, many=True)
return Response(ser.data) def post(self, request): # 新增一个
# 获取前端传入的数据
ser = BookSeSerializer(data=request.data)
# 先校验数据
if ser.is_valid():
# 校验通过就保存
ser.save()
# 给前端返回保存结果
return Response({'code': 100, 'msg': '新增数据成功', 'result': ser.data})
else:
return Response({'code': 101, 'msg': ser.errors}) class BookDetailView(APIView):
def get(self, request, *args, **kwargs): # 查询单个
# 查询单个数据
book = Book.objects.filter(pk=kwargs.get('pk')).first()
# 序列化,因为点first()了所以不是queryset对象,因此不用传many=True
ser = BookSeSerializer(instance=book)
# 返回给前端看
return Response(ser.data) def put(self, request, pk):
# 先查询出来
book = Book.objects.filter(pk=pk).first()
# 反序列化数据
ser = BookSeSerializer(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}) def delete(self, request, pk):
Book.objects.filter(pk=pk).delete()
return Response({'code': 999, 'msg': '删除成功'})

二、序列化类代码

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from .models import Book """
在这里写序列化类
写序序列化某些字段的类属性
里面写保存逻辑和修改逻辑<<<<这个是反序列化保存的过
写局部钩子和全局钩子来校验前端传过来的数据
""" class BookSeSerializer(serializers.Serializer):
# 序列化某些字段 serializers下大致跟models下的类是对应的
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField() def create(self, validated_data):
# 保存逻辑,validated_data是校验过后的数据,保存到数据库
book = Book.objects.create(**validated_data)
return book def update(self, 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是否合法
if name.startswith('sb'):
print('why???')
raise ValidationError('不能以sb开头')
else:
return name def validate(self, attrs):
# 全局钩子 校验过后的数据,设置书名和出版社名字不能一致 当然只是为了节目效果
if attrs.get('name') == attrs.get('publish'):
raise ValidationError('书名和出版社名字不能一致')
else:
return attrs

三、路由代码

from django.contrib import admin
from django.urls import path
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()), ]

四、模型表代码

from django.db import models

class Book(models.Model):
name = models.CharField(max_length=32, verbose_name='书名')
price = models.CharField(max_length=32, verbose_name='价格')
publish = models.CharField(max_length=32, verbose_name='出版社')

当然是得有数据,模型层,用的依然是基于view写接口的表数据,反正今天的重点是研究接口的编写!

基于APIView写接口的更多相关文章

  1. node+pm2+express+mysql+sequelize来搭建网站和写接口

    前面的话:在这里已经提到了安装node的方法,node是自带npm的.我在技术中会用es6去编写,然后下面会分别介绍node.pm2.express.mysql.sequelize.有少部分是摘抄大佬 ...

  2. 基于注解的接口限流+统一session认证

    代码心得: 一个基本的做法:对于用户身份认证做到拦截器里,针对HandlerMethod进行统一拦截认证,根据方法上的注解标识,判别是否需要身份验证,并将查找出来的User实体存入ThreadLoca ...

  3. 基于HttpRunner的接口自动化测试平台HttpRunnerManager(二)

    https://github.com/HttpRunner/HttpRunnerManager HttpRunnerManager Design Philosophy 基于HttpRunner的接口自 ...

  4. apiAutoTest:基于mitmproxy实现接口录制

    目录 apiAutoTest 目前功能 重大更新(个人认为) 本次更新 契机 根本 如何录制 录制的用例 执行录制的用例 执行结果 实现源码 参考资料 apiAutoTest 先软文介绍下:apiAu ...

  5. JS基于时间戳写的浏览访问人数

    Title:JS基于时间戳写的浏览访问人数  --2013-12-23 14:07 <script language="JavaScript"> var timesta ...

  6. Matlab与.NET基于类型安全的接口混合编程入门

    原文:[原创]Matlab与.NET基于类型安全的接口混合编程入门 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ...

  7. java为移动端写接口

    java作为一门后端语言,其厉害之处在于web,大家比较熟知的各种网络应用,java都能做,那么在这个移动优先的时代,如何继续发挥java的强大呢.通常是让java作为一个app的服务端,为app客户 ...

  8. 用yii2给app写接口(下)

    上一节里我们讲了如何用Yii2搭建一个能够给App提供数据的API后台应用程序.那么今天我们就来探讨下授权认证和通过API接口向服务器提交数据以及如何控制API接口返回那些数据,不能返回那些数据. 授 ...

  9. [MyBatis]DAO层只写接口,不用写实现类

    团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...

  10. JAVA写接口傻瓜(?)教程(一)

    当一个安卓开发人员/微信小程序开发者想做点什么的时候,如果他发现没有合适的接口,那么单机安卓.本地数据库emmm.没了接口就好像老人没了拐杖.盲人没了墨镜,完全可以称得上是举步维艰.生活艰难到需要自己 ...

随机推荐

  1. 记一次多个Java Agent同时使用的类增强冲突问题及分析

    摘要:Java Agent技术常被用于加载class文件之前进行拦截并修改字节码,以实现对Java应用的无侵入式增强. 本文分享自华为云社区<记一次多个JavaAgent同时使用的类增强冲突问题 ...

  2. 又拍云之 Keepalived 高可用部署

    在聊 Keepalived 之前,我们需要先简单了解一下 VRRP.VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是专门为了解决静态路由的高可用而 ...

  3. Java:ArrayList的基本使用(学习笔记)

    ​ 集合和数组的对比(为什么要有集合) 分为俩点 1. 长度:数组的长度是固定的,集合的长度是可变的. 2. 存储类型: 数组:可以存储基本数据类型,引用数据类型. 集合:只能存储引用数据类型. 小t ...

  4. sql-lab 通关笔记

    sql-lab less1-4 加单引号报错得到报错信息 根据报错信息判断闭合条件 order by找字段数 union select找回显位置 找到回显位置正常爆数据 相同类型其他关卡 后端代码分析 ...

  5. Mysql通过Merge引擎进行分表

    Mysql通过Merge引擎进行分表 转载: https://www.jianshu.com/p/9420a6a8ae2e https://www.cnblogs.com/xbq8080/p/6628 ...

  6. C温故补缺(八):结构体与共用体

    结构体与共用体 结构体 是一个可以存储多个不同类型的变量的结构,类似于面对对象中的类(只有成员变量的类). struct tag { member-list member-list member-li ...

  7. go-dongle 0.2.0 版本发布了,一个轻量级、语义化的 golang 编码解码、加密解密库

    dongle 是一个轻量级.语义化.对开发者友好的 Golang 编码解码和加密解密库 Dongle 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧 github.com/g ...

  8. appium环境搭建(从入门到放弃)

    一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java.... 2.jdk 1)下载地址 官网(需登录账号): http ...

  9. Mybatis源码解析之执行SQL语句

    作者:郑志杰 mybatis 操作数据库的过程 // 第一步:读取mybatis-config.xml配置文件 InputStream inputStream = Resources.getResou ...

  10. npm Error: Cannot find module 'are-we-there-yet'

    npm 损坏了,are-we-there-yet是npm所依赖的npmlog依赖的一个包,重新安装npm即可 踩坑,直接安装还是报错,不管执行哪个命令都是报下面这个错 网上百度了很多,有的说把node ...