APIView 怎么写?
前后端分离项目配置流程
1.创建项目和子应用。
2.配置项目:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','game', # 注册子应用'rest_framework', # drf框架'corsheaders', # 跨域]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','corsheaders.middleware.CorsMiddleware', # 跨域中间件]CORS_ORIGIN_ALLOW_ALL = True # 允许所有源访问DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','HOST': 'localhost','PORT': 3306,'USER': 'root','PASSWORD': 'root','NAME': 'test',}}LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai';
3.安装数据库
4.编写模型类
5.迁移、注册表、创建超级用户、添加测试数据
6.路由分发
7.序列化器*
序列化:ORM操作的数据 -> JSON数据 查询
反序列化:JSON数据 -> ORM操作的数据 添加和修改
序列化器:用于实现序列化和反序列化的工具。
# 在子应用下新建serializers.py文件from rest_framework import serializers # 导入from game.models import Game# 定义一个普通序列化器,用于处理Game模型类相关的数据class GameSerializer(serializers.Serializer):# 映射字段id = serializers.IntegerField() # 添加id字段name = serializers.CharField(max_length=20)kind = serializers.CharField(max_length=20)score = serializers.IntegerField()age = serializers.IntegerField()# 实现增加功能时需要实现create方法# validated_data时要添加的数据# ** 拆包def create(self, validated_data):result = Game.objects.create(**validated_data)return result # 返回结果# 实现更新功能需要实现update方法# instance要更新的orm对象# validated_data去更新这个对象的数据def update(self, instance, validated_data):instance.id = validated_data.get('id')instance.name = validated_data.get('name')instance.kind = validated_data.get('kind')instance.score = validated_data.get('score')instance.age = validated_data.get('age')instance.save() # 保存更新的数据# 修改数据2中方法 1.update 2.savereturn instance######################################################################## 模型序列化器class GameSerializer2(serializers.ModelSerializer):class Meta: # 配置元类model = Game # 指定模型类fields = "__all__" # 指定字段
8.编写视图*
使用序列化器实现增删改查操作。(查询所有数据、查询单个数据、增加一个数据、修改数据、删除一个数据)
动态路由:删除delete、修改put、查询单个数据get
静态路由:查询所有数据get、增加post
通过分析,使用2个类视图实现增删查改功能。
# 使用序列化器会用到的参数:instance 实例ORM操作数据 data JSON数据# def func(instance, data)# 调用函数 位置参数: func(instance=a,data=b) -> func(a,b) func(instance=a)-> func(a)# 调用函数 指定参数: func(data=a, instance=b) func(data=a) from django.shortcuts import renderfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom game.models import Gamefrom game.serializer import GameSerializer# Create your views here.# 实现游戏角色的查询全部 和 添加class GameView1(APIView):def get(self, request): # 1# ORM操作数据 -》 json数据 序列化# 获取全部游戏信息 ORM操作数据games_data = Game.objects.all()# 使用序列化器,实现序列化# 多个数据需要加上 many=Trueser = GameSerializer(games_data, many=True)# 注意返回的时ser.data 而不是serreturn Response(ser.data)def post(self, request): # 2 增加数据# request.data 就是前端提交的json数据# 1.使用序列化器进行反序列化,data参数就是要反序列化的数据ser = GameSerializer(data=request.data)# 2.校验 参数raise_exception=True,出现异常时自动抛出异常if ser.is_valid(raise_exception=True):# 3.保存ser.save()return Response({'msg':'添加数据成功'}, status=201)return Response({'msg': '添加数据失败'}, status=500)# 根据id 实现 单个 查询 修改 删除class GameView2(APIView):def get(self, request, id): # 3# 根据id获取数据,单个数据try:game_data = Game.objects.get(id=id)except Exception as e:print(e)return Response({'msg':'数据不存在'}, status=404)ser = GameSerializer(game_data)return Response(ser.data, status=200)def put(self, request, id): # 4 反序列化之更新# 1.获取要更新的数据 ORM操作的数据->instancetry:game_data = Game.objects.get(id=id)except Exception as e:print(e)return Response({'msg':'数据不存在'}, status=404)# 2.反序列化 game_data要更新的orm对象 request.data去更新这个对象的数据ser = GameSerializer(instance=game_data, data=request.data)# 3.校验if ser.is_valid(raise_exception=True):# 4.保存ser.save()return Response({'msg':'更新数据成功'}, status=201)return Response({'msg':'更新数据失败'}, status=500)def delete(self, request, id): # 5 删除try:Game.objects.filter(id=id).delete()except Exception as e:print(e)return Response({'msg': '删除失败'}, status=404)return Response({'msg': '删除数据成功'}, status=204)
总结:
1.序列化时,将模型类对象(ORM操作的数据)传入instance参数,返回结果时使用的是ser.data属性获取得到。
2.反序列创建时,将前端提交的数据(JSON数据)传给data参数,要使用is_valid进行校验,调用save进行保存。
3.反序列化更新是,将要更新的数据对象(ORM操作数据)传入instance参数,更新后的数据((JSON数据))传入data参数
4.数据多个时,记得加many=True。
APIView 怎么写?相关推荐
- Django-rest-framework框架之APIView与序列化详解
今日内容概要 基于APIView+Response写视图类 APIView的执行流程(源码分析) Request类的源码分析 验证不同编码格式提交数据(request.POST) 序列化类的序列化的使 ...
- rest-framework:认证组件
一 认证简介: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二 局部使用 models.py class Use ...
- Python实战案例:高血压项目详解(上)
Python实战项目 高血压项目详解(上) 涉及内容:爬虫&开发&数学分析&数据挖掘 a.前端界面的技术--> Juqery Mobile (JQM),俗称"机 ...
- drf之day05: 2个视图基类,GenericAPIView的属性和方法,基于APIView写5个接口,基于GenericAPIView写5个接口,5个视图扩展类,9个视图子类,视图集
目录标题 一:2个视图基类 1.GenericAPIView的属性和方法 二:基于APIView写5个接口 三:基于GenericAPIView写5个接口 四:五个视图扩展类 1..基于Generic ...
- 使用rest_framework写api接口的一些注意事项(axios发送ajax请求)
1. 类继承GenericAPIView,定义queryset 印象深刻的事: 由于原来对于继承关系不太清楚,写接口 APIView/泛指GenericAPIView不太关注queryset 没有设置 ...
- python连接sqlserver_python 链接sqlserver 写接口实例
我是使用pymssql完成的sqlserver,首先下载符合版本的pymssql的whl,然后安装,在pycharm的default setting->project Interpreter中确 ...
- 我python写的闭包为什么效率很低_GitHub - llzhi001/interview_python_practice: interview 面试题 CS-Notes之ME-技术总结...
Star过的Github书籍 值得一看的文章 两地书 服务发现 服务注册.服务发现作为构建微服务架构得基础设施环节,重要性不言而喻.在当下,比较热门用于做服务注册和发现的开源项目包括zookeeper ...
- restful规范和APIView
django生命周期 1.先进入wsgi协议的web服务器2.进入django的中间件3.路由4.视图5.取模板,取数据,用数据渲染模板6.返回模板的字符串7.在wsgi中封装后发送给浏览器 开发模式 ...
- $Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器drf版本控制
1 importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b ...
最新文章
- django view
- 关于splice()方法,slice() 、split()方法讲解,reverse()方法、replace()方法
- 【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门
- 票据打印, 账单打印, 标签打印, 文档打印, 条码打印, 批量打印, 包装纸打印与设计,可变数据打印打印,发布,VC++源代码组件库解决方案...
- android studio 横幅,有关 android studio notification 横幅弹出的功能没有反应
- Spring Boot 2.1.5(27)---WebFlux REST API 全局异常处理 Error Handling
- android 百度室内地图开发,androidsdk | 百度地图API SDK
- LeetCode(944)——删列造序(JavaScript)
- win10-如何管理开机启动项?
- sybase默认数据库
- rails使用html form,在erb文件中使用rails form_tag和html表单代码有什么区别?
- 底物的分子描述符计算及 CYP450 酶-底物选择性技术研究
- 《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销
- 《算法笔记》学习日记——5.2 最大公约数与最小公倍数5.3 分数的四则运算5.4 素数
- 健康知识大全api 取得最新的知识列表
- 做程序员的第八个年头——2021年个人工作总结
- 利用Nginx正向代理加速代码编译外网依赖下载速度
- linux之下载工具那些事
- 梅森公式的推导和探究
- python实现中文和unicode转换