一、视图层代码

"""
基于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. windows socket网络编程--事件选择模型

    目录 事件选择模型概述 API详解 工作原理 代码实现 事件选择模型概述 Winsock提供了另一种有用的异步事件通知I/O模型--WSAEventSelect模型.这个模型与WSAAsyncSele ...

  2. 【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存

    问题描述 在使用Azure Event Hub的SDK时候,常规情况下,发现示例代码中并没有SDK内部的日志输出.因为在Java项目中,没有添加 SLF4J 依赖,已致于在启动时候有如下提示: SLF ...

  3. 【题解】CF1715A Crossmarket

    题面传送门 解决思路 首先,我们让 Megan 先走,因为他可以留下传送门.可以得知,不管怎么走,他到达终点所耗费的能量一定是 \(n+m-2\) . 然后,Stanley 走时就可以利用传送门.考虑 ...

  4. .NET应用开发之SQLServer常见问题分析

    日常我们开发.NET应用时会使用SQLServer数据库,对于SQLServer数据库的日常开发有一些技能和工具,准备给大家分享一下. 一.场景1:SQLServer死锁分析  执行以下SQL,启用S ...

  5. 【深入浅出 Yarn 架构与实现】4-1 ResourceManager 功能概述

    前面几篇文章对 Yarn 基本架构.程序基础库.应用设计方法等进行了介绍.之后几篇将开始对 Yarn 核心组件进行剖析. ResourceManager(RM)是 Yarn 的核心管理服务,负责集群管 ...

  6. AI赋能音乐创作,人人都是音视频创作者

    华为HMS Core音频编辑服务(Audio Editor Kit)依托自身AI技术的研发优势,上线全新的歌声合成音色及伴奏,给音视频创作者提供更多的创作可能.在短视频场景中,用户自定义歌词的歌声结合 ...

  7. vue 中使用 this 更新数据的一次大坑

    情景说明: 之前用 vue 做数据绑定更新时,发现一个莫名奇妙的问题. 我在 vue 实例中声明了一个数组属性如 books: [],在异步请求的回调函数中使用 this.books = res.da ...

  8. 关于解决Failed on cp file to /system - Cross-device link 报错

    前言 在adb shell中移动 android_server时候遇到了这个报错 解决办法 采用 cp 命令代替 mv 命令

  9. 长度最小子数组-LeetCode209 滑动窗口

    力扣:https://leetcode.cn/problems/minimum-size-subarray-sum/ 题目 给定一个含有 n 个正整数的数组和一个正整数 target .找出该数组中满 ...

  10. 1、创建Django项目并配置settings文件

    一.先安装Django第三方库 二.创建项目 新建好项目的目录是这样的 迁移数据库,注意:没有安装pymysql的需要通过pip install pymysql安装. 三.创建模块 四.设置setti ...