Django REST framework实现api接口

drf 是Django REST framework的简称,drf 是基于django的一个api 接口实现框架,REST是接口设计的一种风格。

一、 安装drf

pip install djangorestframework
pip install markdown             # Markdown support for the browsable API.
pip install django-filter        # Filtering support

在django 上运行,首先要安装好django 和数据库驱动,后端接口就是对数据库资源的操作。

二、快速上手

restful 接口的规范:

/book/     GET         查看所有的资源,返回所有的资源
/book/     POST        添加资源,返回添加的资源
/book/1    GET         查看某个资源,返回这一个资源
/book/1    PUT         编辑某个资源,返回这编辑之后的这个资源
/book/1    DELETE      删除某个资源,返回空

实现get 查看所有资源

1、创建数据库表,在models.py中

from django.db import models

# Create your models here.

class Book(models.Model):
    title = models.CharField(verbose_name="书籍名称",max_length=32)
    price = models.DecimalField(verbose_name="价格",decimal_places=2,max_digits=6,null=Ture)
    pub_date = models.DateField(verbose_name="出版日期")

    def __str__(self):
        return self.title

要执行生成表的语句:

py -3 manage.py makemigrations
py -3 manage.py migrate

2、设置路由,在urls.py中


from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('book/', views.BookView.as_view()),

]

3、在视图函数中,views.py
首先要定义一个模型设计序列化器

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework import serializers
from rest_framework.response import Response
from app01 import models

# Create your views here.

class BookSerializers(serializers.Serializer):
    """针对模型设计序列化器"""
    title = serializers.CharField(max_length=32)
    # 默认字段都是必填字段,如果不填会报错,如果要变成可选字段可以加上required=False,该值就可以为空,但是要注意跟数据库的设计一致,数据库的该字段如果是可以为空,那么这里才可以设置字段为空
    price = serializers.DecimalField(max_digits=6,decimal_places=2,required=False)
    #如果想要返回的字段跟数据库的不一致,就需要指定source字段,在数据库中的原始字段名称, 接口返回给前端的是date
    date = serializers.DateField(source="pub_date")

class BookView(APIView):
    """book资源管理类"""

    def get(self,request):
        #获取所有的书籍
        book_list = models.Book.objects.all()
        #构建序列化器对象
        serializer = BookSerializers(instance=book_list,many=True)
        return Response(serializer.data)

4、测试接口
启动django项目
我是安装了一个apiforx的客户端,设置好协议和地址端口。
在这里插入图片描述
在apiforx 中调成调试模式,直接发送get请求,不需要任何参数,点击发送,可以看到返回了一个数组,里面嵌套了字典,这样一个简单的get 请求的接口就完成了。
在这里插入图片描述

实现post请求添加数据

post 请求还是在上面的BookView 中实现,请求的路径不变,只是请求的方式改变为post
在BookView 中增加一个post 方法:

class BookView(APIView):
    """book资源管理类"""

    def get(self,request):
        #获取所有的书籍
        book_list = models.Book.objects.all()
        #构建序列化器对象
        serializer = BookSerializers(instance=book_list,many=True)
        return Response(serializer.data)

    def post(self,request):
        #获取请求数据 {'title': '西厢记', 'price': 188.1, 'date': '2013-08-12'}
        #print(request.data)

        #构建序列化器对象
        serializer = BookSerializers(data=request.data)
        #校验数据
        if serializer.is_valid():  #返回一个布尔值,所有字段皆通过才返回True, serializer.validated_data, 否则返回False, 错误信息存在serializer.errors
            # 校验成功,将数据插入到数据库中
            models.Book.objects.create(**serializer.validated_data)
            return Response(serializer.data)
        #校验失败返回错误信息
        return Response(serializer.errors)

接口测试:
在这里插入图片描述

实现查询某一个资源

查询某一个资源的时候要是get 请求,只是路径后面要带一个id,这个时候就需要重新写一个路由了,因为一个类里面不能有两个get 方法
urls.py

from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/', views.BookView.as_view()),
    re_path('book/(\d+)', views.BookDetialView.as_view()),

]

views.py
重新写一个方法类BookDetialView

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework import serializers
from rest_framework.response import Response
from app01 import models

class BookSerializers(serializers.Serializer):
    """针对模型设计序列化器"""
    title = serializers.CharField(max_length=32)
    # 默认字段都是必填字段,如果不填会报错,如果要变成可选字段可以加上required=False,该值就可以为空,但是要注意跟数据库的设计一致,数据库的该字段如果是可以为空,那么这里才可以设置字段为空
    price = serializers.DecimalField(max_digits=6,decimal_places=2)
    #如果想要返回的字段跟数据库的不一致,就需要指定source字段,在数据库中的原始字段名称, 接口返回给前端的是date
    date = serializers.DateField(source="pub_date")

    def create(self, validated_data):
        new_list = models.Book.objects.create(**self.validated_data)
        return new_list

class BookView(APIView):
    """book资源管理类"""

    def get(self,request):
        #获取所有的书籍
        book_list = models.Book.objects.all()
        #构建序列化器对象
        serializer = BookSerializers(instance=book_list,many=True)
        return Response(serializer.data)

    def post(self,request):
        #获取请求数据 {'title': '西厢记', 'price': 188.1, 'date': '2013-08-12'}
        #print(request.data)

        #构建序列化器对象
        serializer = BookSerializers(data=request.data)
        #校验数据
        if serializer.is_valid():  #返回一个布尔值,所有字段皆通过才返回True, serializer.validated_data, 否则返回False, 错误信息存在serializer.errors
            # 校验成功,将数据插入到数据库中
            #models.Book.objects.create(**serializer.validated_data)
            serializer.save()
            return Response(serializer.data)

        return Response(serializer.errors)

class BookDetialView(APIView):
    def get(self,request,id):
        book = models.Book.objects.get(pk=id)

        #序列化传参instance ,反序列化传参data, 序列化是后端返回数据给前端,反序列化是后端接受数据
        serializer = BookSerializers(instance=book,many=False)
        return Response(serializer.data)

接口测试:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/87047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mongodb两种启动方法

一、命令行启动 1.修改存放数据库的位置 说明:E:\data\mongodb;我在E盘创建的文件夹mongodb mongod --dbpathE:\data\mongodb 2.成功启动 说明:默认端口27017,代表已经启动成功 ,并在mongodb自动创建文件 二、配置项…

JFrog Artifactory介绍

JFrog Artifactory 1. 简介2. 安装3. 使用说明3.1 界面展示3.2 仓库搭建流程(本地库)3.3 普通用户界面展示3.4 上传制品,可单传或多传3.5 下载制品3.6 支持搜索3.7 单个制品复制移动删除3.8 用户管理3.9 存储信息3.10 基本设置 4. 前期调研被…

什么是软件压力测试?软件压力测试工具和流程有哪些?

软件压力测试 一、含义:软件压力测试是一种测试应用程序性能的方法,通过模拟大量用户并发访问,测试应用程序在压力情况下的表现和响应能力。软件压力测试的目的是发现系统潜在的问题,如内存泄漏、线程锁、资源泄漏等,…

心理与神经生物工程交叉学科国际论坛—暨第17届复合医学工程国际会议(CME2023)

心理与神经生物工程交叉学科国际论坛—暨第17届复合医学工程国际会议(CME2023) International Forum on the Intersection of Psychology and Neuromedical Engineering -17th International Conference on Complex Medical Engineering (CME2023) 心…

IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤

dc3 windows 本地搭建步骤: ​​ 必要软件环境 进入原网页# 务必保证至少需要给 docker 分配:1 核 CPU 以及 4G 以上的运行内存! JDK : 推荐使用 Oracle JDK 1.8 或者 OpenJDK8,理论来说其他版本也行; Maven : 推荐…

solidity0.8.0的应用案例10:可升级合约

这个案例是代理合约的实际操作,代理合约实现了逻辑和数据的分离,就可以实现在生产环境中,轻松升级合约,这就是一个如何实际升级合约的案例。 实现一个简单的可升级合约,它包含3个合约:代理合约,…

聚观早报|2023戴尔科技峰会助力创新;小米汽车电池供应商敲定

【聚观365】8月23日消息 2023戴尔科技峰会助力企业创新 小米汽车电池供应商敲定中创新航和宁德时代 iPhone15预计有6种配色 王小川卸任自动驾驶企业禾多科技董事 特斯拉动力总成副总裁宣布离职 2023戴尔科技峰会助力企业创新 近日“新生万物 数实新格局 —— 2023戴尔科技…

记录protocol buffers Mac安装

使用brew安装最新的protobuf 在Mac 上安装,使用brew 可以安装最新的protobuf。这个也比较简单,简单说一下。 首先先检查一下是否安装了brew。如果没有安装brew的话,请先安装brew.可以通过brew --version来检查 使用brew install protobuf 来…

【Modbus通信实验三】数据切片问题

在做两个串口相互通信的实验中,当发送频率快一点时偶尔会遇到以下情景,即一次send中把原数据拆成两份发送,就会导致CRC校验错误。下图中6字节数据拆成42是把SetRThreshold()阈值设为2,当设为1的情况下则会拆成51。 一开始以为是缓…

流弊的docker

docker就是隔离式运行软件组(多个软件),docker分为dockerfile文件,images 镜像,容器,本地仓库,远程仓库。 ckerFile文件,可以获得images镜像 运行镜像获得容器 || 容器提交获得镜像…

二叉树---前,中,后序遍历做题技巧(前,中,后,层次,线索二叉树)

1.由二叉树求前,中,后序遍历 前序:根左右(每一个小方块都遵循) 得到:A,B,D,H,E,I,C,F,G 中序:左根右(每一个小方块都遵循) 得到:H,D,B,I,E,A,F,C,G 后序:左右…

QCC_BES 音频重采样算法实现

+V hezkz17进数字音频系统研究开发交流答疑群(课题组) 这段代码是一个用于将音频数据进行立体声重采样的函数。以下是对代码的解读: 函数接受以下参数: pcm_buf:16位有符号整型的音频缓冲区,存储了输入的音频数据。pcm_len:音频缓冲区的长度。mic1:16位有符号整型的音频…

本地生活服务平台加盟哪家公司好?

本地生活的竞争从年初的火热到现在,已经进入了下半场,随着优胜劣汰的筛选,那么直到现在,想做本地生活服务平台加盟,哪家公司比较好呢,应该如何选择呢? 首先我们得弄懂,我们加盟本地…

在线图片怎么转换成PDF?在线图片转换成PDF步骤介绍

文件格式要转化不知道怎么办?想要网上下载文件格式转换软件,但是却不知道下载哪个好?今天小编小编就给大家分享一下靠谱的小圆象PDF转换器工具,想知道这款软件好不好用?在线图片怎么转换成PDF?那就进来看看吧。 在线图片怎么转换成PDF 小圆象PDF转换…

科技资讯|荷兰电动自行车丢失将被拒保,苹果Find My可以减少丢失

荷兰最大的自行车协会荷兰皇家旅游俱乐部宣布,将不再为胖胎电动自行车提供保险,因为这种自行车的被盗风险极高。 随着电动自行车的销量飙升,胖胎也变得更受欢迎。但问题是,胖胎电动自行车也成为了自行车盗窃者的首选目标。ANWB …

设计模式之迭代器模式(Iterator)的C++实现

1、迭代器模式的提出 在软件开发过程中,操作的集合对象内部结构常常变化,在访问这些对象元素的同时,也要保证对象内部的封装性。迭代器模式提供了一种利用面向对象的遍历方法来遍历对象元素。迭代器模式通过抽象一个迭代器类,不同…

系统卡死问题分析

CPU模式 CPU Frequency Scaling (CPUFREQ) Introduction CPU频率调节设备驱动程序的功能。该驱动程序允许在运行过程中更改CPU的时钟频率。一旦CPU频率被更改,必要的电源供应电压也会根据设备树脚本(DTS)中定义的电压值进行变化。通过降低时钟速度,这种方法可以减少功耗…

伦敦银和伦敦金的区别

伦敦银河伦敦金并称贵金属交易市场的双璧,一般投资贵金属的投资者其实不是交易伦敦金就是交易伦敦银。相信经过一段时间的学习和投资,不少投资者都能分辨二者的区别。下面我们就来谈谈伦敦银和伦敦金有什么异同,他们在投资上是否有差别。 交易…

【Java】树结构数据的搜索

这里写自定义目录标题 需要实现的效果前端需要的json格式:一定是一个完整的树结构错误错误的返回格式错误的返回格式实现的效果 正确正确的返回格式正确的展示画面 后端逻辑分析代码总览 数据库表结构 需要实现的效果 前端需要的json格式:一定是一个完整…

如何使用CSS实现一个水平居中和垂直居中的布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 水平居中布局⭐ 垂直居中布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣…