前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2. DRF入门

2. DRF入门

作者头像
alexhuiwang
发布于 2023-01-30 02:46:15
发布于 2023-01-30 02:46:15
1.7K00
代码可运行
举报
文章被收录于专栏:运维博客运维博客
运行总次数:0
代码可运行

drf介绍

  • Django REST framework (简称:DRF)是一个强大而灵活的 Web API 工具。 遵循RESTFullAPI风格,功能完善,可快速开发API平台。
  • 官网文档:https://www.django-rest-framework.org
  • Django REST framework 最新版使用要求:
    • Python(3.6、3.7、3.8、3.9、3.10)
    • Django(2.2、3.0、3.1、3.2、4.0)

DRF安装与项目配置

DRF安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install djangorestframework
pip install markdown
pip install django-filter

DRF项目配置与初探

  1. 创建django_drf项目
  1. 创建app
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
E:\workspace\django-project\day1\django_drf>python manage.py startapp myapp
  1. Settings.py添加项目配置
  1. 项目结构
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
django_drf
    │  manage.py
    │
    ├─django_drf
    │  │  asgi.py
    │  │  settings.py
    │  │  urls.py
    │  │  wsgi.py
    │  │  __init__.py
    │
    ├─myapp
    │  │  admin.py
    │  │  apps.py
    │  │  models.py
    │  │  tests.py
    │  │  views.py
    │
    └─templates
  1. 主路由配置: django_drf/urls.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp/urls.py'))
]
  1. app路由: django_drf/myapp/urls.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.urls import path,re_path
from myapp import views

urlpatterns = [

]

DRF初探之实现用户增删改查API

  1. 定义app数据模型: myapp/models.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    sex = models.CharField(max_length=16)
    age = models.IntegerField()
  1. 数据同步和迁移
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
E:\workspace\django-project\day1\django_drf>python manage.py makemigrations
E:\workspace\django-project\day1\django_drf>python manage.py migrate
  1. 编写app序列化器文件: myapp/serializers.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from myapp.models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
  1. app试图函数: myapp/views.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from myapp.models import User
from .serializers import UserSerializer
from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
  1. app路由: myapp/urls.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.urls import path,include
from myapp import views
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'user', views.UserViewSet)

urlpatterns = [
    path('api/',include(router.urls))
]
  1. 启动项目访问: http://127.0.0.1:8000/myapp/api/
  1. API信息提交: http://127.0.0.1:8000/myapp/api/user/
  1. 接口信息概览
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://127.0.0.1:8000/myapp/api/user/   #列出所有数据
http://127.0.0.1:8000/myapp/api/user/1/   #对于指定数据进行更新,删除,查看操作

DRF序列化器

序列化与反序列化介绍

在日常开发中,会从别的API获取数据或者自己写API提供数据,数据格式一般都是采用JSON格式。这期间就会涉及两个专业术语:

  • **序列化:**将python对象转json,后端响应
  • **反序列化:**将json转为python对象, 后端处理数据需要转换成python对象

之前常用三种序列化方式:JSON

之前经常用json模式完成序列化与反序列化操作:

  • 序列化应用场景示例:用ORM查询数据,采用JSON格式API返回数据。
  • 反序列化应用场景示例:从别的API获取数据,在Python里处理。

之前常用三种序列化方式: Django内置Serializers模块

Serializers是Django内置的一个序列化器,可直接将Python对象转为JSON格式,但不支持反序列化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.core import serializers
obj = User.objects.all()
data = serializers.serialize('json', obj)

之前常用三种序列化方式: Django内置JsonResponse模块

JsonResponse模块自动将Python对象转为JSON对象并响应。

DRF序列化器

DRF中有一个serializers模块专门负责数据序列化,DRF提供的方案更先进、更高级别的序列化方案。

  • 序列化器支持三种类型:
    • **Serializer:**对Model(数据模型)进行序列化,需自定义字段映射。
    • **ModelSerializer:**对Model进行序列化,会自动生成字段和验证规则,默认还包含简单的create()和update()方法。
    • **HyperlinkedModelSerializer:**与ModelSerializer类似,只不过使用超链接来表示关系而不是主键ID。
Serializer用户查询接口
  1. 编写app序列化器文件: myapp/serializers.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import serializers

class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    city = serializers.CharField()
    sex = serializers.CharField()
    age = serializers.CharField()
  1. app视图函数: myapp/views.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.views import APIView
from rest_framework.response import Response

class UserApiView(APIView):
    def get(self,request,id=None):
        #获取单条数据
        if id:
            user_obj = User.objects.get(id=id)
            user_serializers = UserSerializer(user_obj)
        else:
        #返回所有数据
            queryset = User.objects.all()
            user_serializers = UserSerializer(queryset,many=True)
        return Response(user_serializers.data)
  1. app路由: myapp/urls.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.urls import re_path
from myapp import views
urlpatterns = [
    re_path('api/user/$',views.UserApiView.as_view()),
    re_path('api/user/(?P<pk>\d+)/$',views.UserApiView.as_view()),
]
  1. 数据查看测试: a. http://127.0.0.1:8000/myapp/api/user/

​ b. 查看单条数据: http://127.0.0.1:8000/myapp/api/user/1/

Serializer用户创建接口

上述的配置不变,只需要变动视图和序列化

  1. app视图函数: myapp/views.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import User
from .serializers import UserSerializer

class UserApiView(APIView):
    def get(self,request,id=None):
        #获取单条数据
        if id:
            user_obj = User.objects.get(id=id)
            user_serializers = UserSerializer(user_obj)
        else:
        #返回所有数据
            queryset = User.objects.all()
            user_serializers = UserSerializer(queryset,many=True)
        return Response(user_serializers.data)

    def post(self,request):
        #数据反序列化
        user_ser = UserSerializer(data=request.data)    #request.data是用户POST数据
        if user_ser.is_valid():
            #保存数据库
            user_ser.save()
            res = {'code': 200, 'msg': '创建用户成功'}
        else:
            res = {'code': 500, 'msg': '创建用户失败'}
        return Response(res)
  1. app序列化文件: myapp/serializers.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from myapp.models import User
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    city = serializers.CharField()
    sex = serializers.CharField()
    age = serializers.IntegerField()

    def create(self, validated_data):
        return User.objects.create(**validated_data)
  1. 创建数据测试: http://127.0.0.1:8000/myapp/api/user/
  1. 创建数据结果返回: http://127.0.0.1:8000/myapp/api/user/
Serializer用户更新和删除接口
  1. app视图函数: myapp/views.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import User
from .serializers import UserSerializer
from rest_framework import viewsets

class UserApiView(APIView):
    def get(self,request,id=None):
        #获取单条数据
        if id:
            user_obj = User.objects.get(id=id)
            user_serializers = UserSerializer(user_obj)
        else:
        #返回所有数据
            queryset = User.objects.all()
            user_serializers = UserSerializer(queryset,many=True)
        return Response(user_serializers.data)

    def post(self,request):
        #数据反序列化
        user_ser = UserSerializer(data=request.data)    #request.data是用户POST数据
        if user_ser.is_valid():
            #保存数据库
            user_ser.save()
            res = {'code': 200, 'msg': '创建用户成功'}
        else:
            res = {'code': 500, 'msg': '创建用户失败'}
        return Response(res)

    def put(self,request,id=None):
        user_obj = User.objects.get(id=id)
        user_serializer = UserSerializer(instance=user_obj, data=request.data)
        if user_serializer.is_valid():
            user_serializer.save()
            res = {'code': 200, 'msg': '更新用户成功'}
        else:
            res = {'code': 500, 'msg': '更新用户失败'}
        return Response(res)
    
    def delete(self,request,id=None):
        user_obj = User.objects.get(id=id)
        user_obj.delete()
        res = {'code': 200, 'msg': '删除用户成功'}
        return Response(res)
  1. 序列化配置: myapp/serializers.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from myapp.models import User
from rest_framework import serializers

class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    city = serializers.CharField()
    sex = serializers.CharField()
    age = serializers.IntegerField()

    def create(self, validated_data):
        return User.objects.create(**validated_data)

    def update(self, instance, validated_data):
        return User.objects.filter(id=instance.id).update(**validated_data)
  1. 数据更新测试: http://127.0.0.1:8000/myapp/api/user/1/
  1. 状态查看:PUT之后查看
  1. 删除数据: http://127.0.0.1:8000/myapp/api/user/3/
  1. 查看结果: http://127.0.0.1:8000/myapp/api/user/
错误返回值优化
  • 在数据校验时候传入这个配置即可捕获异常,异常状态码是400: raise_exception=True
  • 需要修改app的视图函数: myapp/views.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from myapp.models import User
from .serializers import UserSerializer
from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


from rest_framework.views import APIView
from rest_framework.response import Response

class UserApiView(APIView):
    def get(self,request,id=None):
        #获取单条数据
        if id:
            user_obj = User.objects.get(id=id)
            user_serializers = UserSerializer(user_obj)
        else:
        #返回所有数据
            queryset = User.objects.all()
            user_serializers = UserSerializer(queryset,many=True)
        return Response(user_serializers.data)

    def post(self,request):
        #数据反序列化
        user_serializer = UserSerializer(data=request.data)    #request.data是用户POST数据
        user_serializer.is_valid(raise_exception=True)
        user_serializer.save()
        res = {'code': 200, 'msg': '创建用户成功'}
        return Response(res)

    def put(self,request,id=None):
        user_obj = User.objects.get(id=id)
        user_serializer = UserSerializer(instance=user_obj, data=request.data)
        user_serializer.is_valid(raise_exception=True)
        user_serializer.save()
        res = {'code': 200, 'msg': '创建用户成功'}
        return Response(res)

    def delete(self,request,id=None):
        user_obj = User.objects.get(id=id)
        user_obj.delete()
        res = {'code': 200, 'msg': '删除用户成功'}
        return Response(res)
  • 更新和创建数据测试
DRF序列化器: 序列化器参数
  • 序列化器工作流程:
    • 序列化(读数据:视图里通过ORM从数据库获取数据查询集对象 -> 数据传入序列化器-> 序列化器将数据进行序列化 -> 调用序列化器的.data获取数据 -> 响应返回前端
    • 反序列化(写数据):视图获取前端提交的数据 -> 数据传入序列化器 -> 调用序列化器的.is_valid方法进行效验 -> 调用序列化器的.save()方法保存数据
  • 序列化器常用方法与属性:
    • serializer.is_valid():调用序列化器验证是否通过,传入raise_exception=True可以在验证失败时由DRF响应400异常。
    • serializer.errors:获取反序列化器验证的错误信息
    • serializer.data:获取序列化器返回的数据
    • serializer.save():将验证通过的数据保存到数据库(ORM操作)
  • 常用参数
  • 通用参数
DRF序列化器:扩展验证规则

如果常用参数无法满足验证要求时,可通过钩子方法扩展验证规则。

  • 局部钩子:validate_字段名(self, 字段值)
  • 全局钩子:validate(self, 所有校验的数据字典)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
django--ajax的使用,应用
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)
测试开发社区
2019/09/20
8510
django--ajax的使用,应用
Python进阶30-Django AJAX
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
7860
Python进阶30-Django AJAX
Django Ajax序列化与反序列化
序列化与反序列是最常用的功能,有时我们需要将一个表单组打包成Json格式等然后再提交给服务端,这样可以提高效率节约带框,如下是Django配合Ajax实现的序列化与反序列化,文件上传等操作。
王瑞MVP
2022/12/28
2.8K0
跨域和CORS
  同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。    
changxin7
2019/12/19
1.1K0
Python进阶34-Django 中间件
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.9K0
Python进阶34-Django 中间件
Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器
AJAX(Asynchronous Javascript And XML 异步的Javascript和XML)
suwanbin
2019/09/26
6.4K0
Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器
Django Ajax 实现历史图形查询
Django 通过Ajax接口实现前后端数据交互功能,通过Ajax实现当用户输入要查询的数据时,发送到后端,后端处理后推送到前端,前端直接绘制图形。
王瑞MVP
2022/12/28
1K0
Django Ajax 实现历史图形查询
Django ajax 简单介绍
Asynchronous Javascript And XML是 "异步Javascript和XML"。即使用 Javascript 语言与服务器进行异步交互,传输的数据为XML。
py3study
2020/01/15
5740
Django ajax 简单介绍
Django与LayUI 框架实现表格分页
layui 框架与BootCSS框架相似都属于前端美化框架,区别在于BootCSS更加专业,而LayUI则更多的是面向于后端开发者,所以在组织形式上毅然采用了几年前的以浏览器为宿主的类 AMD 模块管理方式,却又并非受限于 CommonJS 的那些条条框框,它拥有自己的模式,更加轻量和简单。
王瑞MVP
2022/12/28
2.6K0
Django与LayUI 框架实现表格分页
Django简介
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:
py3study
2018/08/03
1.7K0
ajax与django采用json进行数据交互
1新建django项目名为json_ajax,应用名为app,在templates模板中新建ajax.html文件
菲宇
2019/06/13
2.2K0
Django如何与ajax通信
注意:这里需要注意的是button的type不能写submit,因为写了submit就直接使用get请求/query/了,而没有执行ajax请求。
marsggbo
2020/06/12
1.7K0
Django 基于 jquery 的 a
<1> $.ajax的两种写法: $.ajax("url",{}) $.ajax({}) <2> $.ajax的基本使用 $.ajax({ url:"//", data:{a:1,b:2}, type:"GET", success:function(){} }) $.get() 方法 创建一个 static 文件夹,用来存储 jquery.min.js 配置 settings.py, 在最后添加 STATICFILES_DIRS=( os.pa
py3study
2020/01/15
4540
Django 基于 jquery 的 a
从0开始做系统之传递数据
我们做系统,光有后台不行,还得有好看和便利的前台来操作和展示信息。前端一般是用html5和JS来控制。如果好看,你还得懂css。 后台控制数据和逻辑,前台控制交互和展示。所以前后台得通信,交换信息。这里就是讲他们如何传递数据的。 市面上的系统一般的架构都是MVC的,M指的是model,数据库这层。V是view,界面这层,C是控制逻辑这层。 如果我们打开一个网页,请求网址后,它会去C这层,去哪个路由,要什么样的业务逻辑,展现到哪个页面,都是由这层控制。先去M里面拿取数据,然后渲染到V这层,最终面对的是用户。
赵云龙龙
2019/07/11
1.5K0
从0开始做系统之传递数据
Django Ajax 实现Web命令行执行
Ajax序列化实现简单命令工具: 我们通过定制Django,配合命令行执行功能可以实现远程命令执行页面.
王瑞MVP
2022/12/28
1.1K0
【全栈开发】---- 一文掌握Django的轮询、长轮询
在我们日常开发Web应用程序时,通常依赖HTTP协议来实现客户端与服务器之间的通信。在这种模式下,浏览器发起请求,服务器处理并响应这些请求。尽管这种请求-响应模型适用于大多数应用场景,但在某些情况下,比如直播间的实时聊天功能,它显得力不从心。具体来说,在一个直播间中,当一位用户发送消息后,其他观众需要即时看到这条信息,这就要求服务器能够主动向客户端推送更新,而不是被动地等待客户端发起请求。
用户11404404
2025/03/06
1270
09.Django基础七之Ajax
    AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
changxin7
2019/09/30
3.7K0
09.Django基础七之Ajax
Django---Ajax
Ajax准备知识:json 什么是json? 定义: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 讲json对象,不得不提到JS对象: 合格的json对象:
用户1214487
2018/01/24
4.9K0
Django---Ajax
利用 Django 动态展示 Pyecharts 图表数据的几种方法
本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法!
Python编程与实战
2020/11/16
5.7K0
利用 Django 动态展示 Pyecharts 图表数据的几种方法
django 实现
Title 1.输入信息,在底部输出用户输入的信息(数据存储在数据库中) urls.py from django.contrib import admin from django.urls import path from first import views urlpatterns = [ path('admin/', admin.site.urls), path('info/', views.show_info), path('userInfo', views.show_us
py3study
2020/01/19
3350
推荐阅读
相关推荐
django--ajax的使用,应用
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验