一、视图层代码

"""
基于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学习之EL和JSTL

    0x00前言 EL和JSTL都是JSP的内容的拓展,都是开发的一些东西,稍微学习记录一下,避免以后忘记 0x01EL 0x1基本用法 概念:Expression language 表达式语言 作用:替 ...

  2. [zoj] 4178. Killing the Brute-force

    题目 Chenjb is the task author of the 71-st Zhejiang Provincial Collegiate Programming Contest. He cre ...

  3. 【ELK解决方案】ELK集群+RabbitMQ部署方案以及快速开发RabbitMQ生产者与消费者基础服务

    前言: 大概一年多前写过一个部署ELK系列的博客文章,前不久刚好在部署一个ELK的解决方案,我顺便就把一些基础的部分拎出来,再整合成一期文章.大概内容包括:搭建ELK集群,以及写一个简单的MQ服务. ...

  4. 2022-11-01 Acwing每日一题

    第k个数 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数(所有整数均在 1 ...

  5. go工具pprof部署

    在做内存分析时,用到了pprof,这里做一下部署介绍和入门级别的使用. pprof是golang的性能工具,有两种交互方式:命令行交互和web交互,同时还支持性能分析数据的图形化展示. 部署pprof ...

  6. Go语言核心36讲41

    你好,我是郝林,今天我们继续分享bytes包与字节串操作的相关内容. 在上一篇文章中,我们分享了bytes.Buffer中已读计数的大致功用,并围绕着这个问题做了解析,下面我们来进行相关的知识扩展. ...

  7. C温故补缺(十四):内存管理

    内存管理 stdlib库中有几个内存管理相关的函数 序号 函数和描述 1 void *calloc(int num, int size);在内存中动态地分配 num 个长度为size 个字节 的连续空 ...

  8. MybatisPlus快速入手-----逆向工程

    public class getCode { @Test public void main1() { // 1.创建代码生成器 AutoGenerator mpg = new AutoGenerato ...

  9. 第1章-Spring的模块与应用场景

    目录 一.Spring模块 1. 核心模块 2. AOP模块 3. 消息模块 4. 数据访问模块 5. Web模块 6. 测试模块 二.集成功能 1. 目标原则 2. 支持组件 三.应用场景 1. 典 ...

  10. 【Java EE】Day12 XML、约束(DTD、Schema)、解析方式、Jsoup、选择器(Selector、XPath)

    一.XML介绍 1.概述 Extensible Markup Language--可扩展标记语言 标记语言 :标签构成 可扩展:可以自定义标签 2.功能 存储数据 作为配置文件使用 作为数据载体在网络 ...