一、视图层代码

"""
基于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. MYSQL一键导库脚本

    上周完成了一个性能测试环境搭建,有富余时间的同时研究了一个一键导库的脚本,一周的开始先马住!!! 一.思路 准备:54.158服务器上分别已经装好了MYSQL数据库 目的:把部分库从54导出并导入到1 ...

  2. 安卓APP和小程序渗透测试技巧总结

    安卓APP和小程序渗透测试技巧总结 免责声明: 安卓7以上抓取https流量包 证书信任 首先安装OpenSSL,此步骤不再赘述,可以参考百度. 然后安装模拟器(我使用的是夜神模拟器). 导出需要的证 ...

  3. 「工具推荐」golang 代码可视化工具 go-callvis

    「工具推荐」go-callvis go-callvis是相对 以图片的形式展示了go程序的调用关系,这个工具在看复杂项目时尤其有用. 亲测,借助它看祖传golang代码,头痛好多了. 安装 go ge ...

  4. Go语言核心36讲30

    你好,我是郝林,今天我继续分享条件变量sync.Cond的内容.我们紧接着上一篇的内容进行知识扩展. 问题 1:条件变量的Wait方法做了什么? 在了解了条件变量的使用方式之后,你可能会有这么几个疑问 ...

  5. 已经有 MESI 协议,为什么还需要 volatile 关键字?

    本文已收录到  GitHub · AndroidFamily,有 Android 进阶知识体系,欢迎 Star.技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群. 前言 大家好 ...

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

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

  7. Spring之SpringContext

    一.概述 1.Spring Context概念 创建上下文并将BeanPostProcessor加载到spring 2.Spring Application Context概念 Spring通过应用上 ...

  8. 【Java SE】Day06 类与对象、封装和构造方法

    一.面向对象思想 1.概述:调用对象的行为实现功能,无需一步一步实现(从执行者变成指挥者) 2.类和对象 类是属性和行为的集合,可以看成描述事物的模板 对象是事物的具体体现,是类的一个实例,具备该类的 ...

  9. Java中将 int[] 数组 转换为 List(ArrayList)

    前言 说起数组转换成 ArrayList,很多同学第一反应就是遍历数组,将元素逐个添加到 ArrayList 中,但是这个看着就lower,一般不会这么答. 所以马上就会想到Arrays工具类的 as ...

  10. Javascript | 分别用async await异步方法和Promise来实现一个简易的求职程序

      关注公众号,一起交流,微信搜一搜: LiOnTalKING   JavaScript Promise Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务 ...