Django 第五章RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查

news2024/11/24 20:38:17

在这里插入图片描述

定义
Django REST framework (简称 DRF) 是一个强大灵活的wb api工具 功能完善,可快速开发api平台
官网地址

https://www.django-rest-framework.org/

安装要求
在这里插入图片描述

pip3 install django==3.2
pip3 install djangorestframework

1.0 使用drf实现用户的增删改查

1.创建app
2.定义数据模型并同步数据库
3.编写序列化器文件
4.编写视图
5.添加api路由

1.1修改settings.py文件

在这里插入图片描述

1.2 创建一个app

python3  manage.py startapp myapp_api

1.3 定义数据模型并同步(models.py)

from django.db import models

# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    sex = models.CharField(max_length=30)
    age = models.IntegerField()
python3  manage.py makemigrations  #同步数据
python3  manage.py  migrate    #迁移数据

1.4 编写序列化器文件(serializers.py)

在这里插入图片描述

from  myapp_api.models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

1.5 编写视图(views.py)

from  rest_framework import viewsets
from .serializers import UserSerializer
from myapp_api.models import User

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()      #指定操作的数据库
    serializer_class = UserSerializer  #指定序列化器

1.6添加路由api

1.6.1 主路由
在这里插入图片描述
1.6.2 app路由

from django.urls import path, include
from  myapp_api import views
from rest_framework import routers


#自动注册路由
router = routers.DefaultRouter()
router.register(r'user',views.UserViewSet)

urlpatterns = [
    path('api/', include(router.urls)), #类视图

]

在这里插入图片描述

1.7 验证

http://127.0.0.1:8000/myapp_api/api/

在这里插入图片描述

post请求验证

在这里插入图片描述

get请求验证

在这里插入图片描述

put请求验证(更新)更新年龄35

在这里插入图片描述

delete请求验证

在这里插入图片描述

最终实现数据的增删改查功能!!!

2.0 python 三种常用的序列化方式

2.1 JSON模块

序列化应用场景:用ORM查询数据,采用JSON格式api返回数据
反序列化应用场景:从别的api获取数据,在python里处理
在这里插入图片描述

2.2 Django内置的JsonResponse模块

JsonResponse模块自动将pthon对象转化为json对象并响应
在这里插入图片描述
缺点: 只能序列化,不支持反序列化,不支持将json对象转化成python对象

2.3 django内置serializers模块

serializers是Django内置的一个序列化器,可直接将python QuerySet对象转化成json格式,但是不支持反序列化。
在这里插入图片描述
在这里插入图片描述
DRF中有个serializers模块专门负责数据的序列化。
序列化器支持的三种类型:

Serializer: `对Model(数据模型)进行序列化,需自动移字段映射`
ModelSerializer: `对Model(数据模型)进行序列化,会自动生成字段和验证规则,默认包含简单的create()和update()方法`
HyperlinkedModelSerializer: `与ModelSerializer类似,只不过使用超链接来便是关系而不是主键ID`

2.3.1 单独使用 Serializer序列化器实现增删改查

第一步(修改serializers.py文件)

from  myapp_api.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()

第二步编写视图

from  rest_framework.views  import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response

class UserView(APIView):
    def get(self,request):
        #获取所有用户
        queryset = User.objects.all()
        #调用序列化器将queryset对象 转化为json
        user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据,需要指定many=True
        # .data是获取序列化结果
        return Response(user_ser.data)
    def post(self,request):
        pass
    def put(self,request):
        pass
    def delete(self,request):
        pass

第三步编写路由

from django.urls import path, re_path
from  myapp_api import views


urlpatterns = [
    re_path('^api/user/$', views.UserView.as_view()),

]

第四步 验证
在这里插入图片描述

第五步 查询单用户数据

from  rest_framework.views  import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response

class UserView(APIView):
    def get(self, request, id=None):
        if id:
            #获取单用户
            obj = User.objects.get(id=id)
            # 调用序列化器将queryset对象 转化为json
            user_ser =UserSerializer(obj)
        else:
            #获取所有用户
            queryset = User.objects.all()
            #调用序列化器将queryset对象 转化为json
            user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据,需要指定many=True
            # .data是获取序列化结果
        return Response(user_ser.data)
    def post(self,request):
        pass
    def put(self,request):
        pass
    def delete(self,request):
        pass

在这里插入图片描述

第六步 创建用户

1.0

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': '创建用户失败,数据格式不正确'}

在这里插入图片描述
2.0 在序列化类将数据进行重写
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第七步 更新用户数据

7.1 编写serializers.py (更新用户数据,重写数据库)
在这里插入图片描述
7.2 编写put更新接口

def put(self,request,id=None):
    obj = User.objects.get(id=id)
    user_ser = UserSerializer(instance=obj,data=request.data)
    if user_ser.is_valid():
        #保存数据
        user_ser.save()
        res = {'code': 200, 'msg': '更新用户成功'}
    else:
        res = {'code':500, 'msg': '更新用户失败,数据格式不正确'}
    return Response(res)

7.3 测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
异常情况测试,格式不对会直接报错
在这里插入图片描述
在这里插入图片描述

第八步 编写删除用户的接口

def delete(self,request,id=None):
    obj = User.objects.get(id=id)
    obj.delete()
    res = {'code': 200, 'msg': '删除用户成功!'}
    return Response(res)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删除成功

http://127.0.0.1:8000/myapp_api/api/user/

至此,使用serializers序列化器实现了增删改查的api接口编写测试

序列化:视图ORM查询数据库---> 数据产乳序列化器--->从 .data获取数据--->响应前端
反序列化:获取用户提交数据--->数据传入序列化器--->调用.save保存数据(重写create和update方法)

序列化器常用的方法和属性
serializer.is_valid(): 调用序列化器验证是否通过,传入raise_exception=True可以在验证失败时由DRF响应400异常
serializer.errors:获取反序列化器的错误信息
serializer.data: 获取序列化器返回的数据
serializer.save():将验证通过的数据保存到数据库(ORM操作)
完整的接口如下

from  rest_framework.views  import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response

class UserView(APIView):
    def get(self, request, id=None):
        if id:
            obj = User.objects.get(id=id)  # 获取单用户,调用序列化器将queryset对象 转化为json
            user_ser =UserSerializer(obj)
        else:
            queryset = User.objects.all() ##获取所有用户,调用序列化器将queryset对象 转化为json
            user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据,需要指定many=True
        return Response(user_ser.data)             # .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):
        obj = User.objects.get(id=id)
        user_ser = UserSerializer(instance=obj,data=request.data)
        if user_ser.is_valid():
            user_ser.save()
            res = {'code': 200, 'msg': '更新用户成功'}
        else:
            res = {'code':500, 'msg': '更新用户失败,数据格式不正确'}
        return Response(res)

    def delete(self,request,id=None):
        obj = User.objects.get(id=id)
        obj.delete()
        res = {'code': 200, 'msg': '删除用户成功!'}
        return Response(res)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

influxdb问题: unable to create database ‘mydb‘ 与 failed to send metrics to influx

[influx-metrics-publisher] ERROR i.m.i.InfluxMeterRegistry - [createDatabaseIfNecessary,117] - unable to create database mydb; [influx-metrics-publisher] ERROR i.m.i.InfluxMeterRegistry - [publish,161] - failed to send metrics to influx现象解决方…

Spring REST风格

REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格。 当我们想要表示一个网络资源时,传统方式通常是用一个请求url表示一个操作。这样既不方便,也不安全,因为操作对于用户是透…

精要速览 | PacBio三代全长扩增子测序的多方向研究应用进展

随着测序技术的不断发展,组学研究愈加深入。在微生态研究领域,受限于二代测序读长的扩增子测序技术,迎来了“解放式”全面发展优化的三代测序时代——PacBio全长扩增子测序的优势逐渐显现:凭借其超长读长,高准确率&…

独立产品灵感周刊 DecoHack #044 - 新的一年如何管理你的时间

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。本周看到了很多时间管理的工具类型产品&…

力扣中SQL刷题

小知识点 取余数:mod(数,2) 取第一个字母:left(name,1) 或者name like ‘M%’ 196. 删除重复的电子邮箱 题型:删除列A中重复的记录,指保留列B最小的那一行记录 答案:delete t1 from 表名 t1,表名 t2 where t1.列At2…

测试——自动化测试(Selenium工具)

目录 一、自动化测试的概念以及分类 二、Selenium—web自动化测试工具 1、自动化测试的一些前置工作 2、第一个自动化实例 3、总结​编辑 三、 Selenium常用方法 定位元素的方法 元素的操作 等待 强制等待(待补充) 隐式等待(待补充&…

【python】python绘制相关性热力图

1.介绍 热力图(heatmap),又称相关系数图,根据热力图中不同方块颜色对应的相关系数的大小,可以判断出变量之间相关性的大小。热力图通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。例如…

从运营小程序到实现数字化生态闭环还差几步?

近年来,不少企业纷纷开始关注小程序的开发。对于用户来说,小程序最大的好处就是能够即点即用,体验便捷。不知你是否发现,小程序经济已经开始制约中小企业的服务与合作。 对于一般的中小企业乃至大企业里没有什么IT预算的部门&…

缺省参数!C++教你如何成为一名优秀的舔狗

👑专栏内容:C学习笔记⛪个人主页:子夜的星的主页💕座右铭:日拱一卒,功不唐捐 目录一、前言二、缺省参数1、缺省参数的定义2、缺省参数的分类Ⅰ、全缺省参数Ⅱ、半缺省参数三、注意事项1、直给中间的参数传参…

Docker中的容器命令

1、新建启动容器 docker run 镜像名 参数: -it 启动前台一个交互的终端 --name 启动容器后,赋予容器一个名字 -d: 后台运行容器,并返回容器ID,也即启动守护式容器; -P: 随机端口映射; -p: 指定端口映…

Svelte框架实现表格协同文档

首先,从框架搭建上,本篇示例采用当下流行的前后端分离的开发方式,前端使用npm作为脚手架搭建Svelte框架。 后端使用Java的SpringBoot作为后端框架。 首先,介绍下在前端Svelte框架下搭建在线表格编辑器。 1、在pageage.json文件中引入相关资源…

ANR问题分析

ANR概念 anr是指应用程序无响应,Android系统对于一些事件需要在一定时间范围内完成,如果超过预定时间未能得到有效响应或者响应时间过长,都会造成anr。通常发生anr时,系统会弹出一个提示框,让用户知道,该程…

AppScan介绍和安装

第一节-AppScan介绍和安装 1.简介 Appscan 10中文版是是全新网络安全漏洞扫描软件,软件可以直接可以对OS命令、SSRF和XXE攻击等漏洞进行检测,使得漏洞检测更加容易,提高漏洞的扫描效率。软件同时支持动态、静态、互动分析三种不同的测试功能…

OVN实验----NAT

概述 在L2互通、L3互通实验基础上通过NAT实现访问公网。 架构图如下, 这里两台逻辑路由器LR1和GLR是通过一台逻辑交换机LSjoin互连的, GLR和物理网络设备通过LSlocal相连。 物理拓扑 如上一个实验OVN实验----L2互通 逻辑拓扑 配置 开始实验前先检查…

设计模式之装饰者模式

装饰者模式 定义 先上定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。 优缺点 优点: 1,装饰器是继承的有力补充,比继承灵活,在不改…

【进阶C语言】文件操作

文章目录一.文件1.文件的功能2.文件的分类3.文件路径绝对路径相对路径4.文件信息区5.文件缓冲区6.流的概念7.输入输出二.文件函数1.打开与关闭文件打开文件——fopen返回类型参数关闭文件——fclose返回类型参数2. 顺序读写1.输入输出字符输入字符函数——fgetc返回类型函数参数…

新享科技UniPro将敏捷理念数字化 助力企业迎接2023

2023年新年伊始,“复苏”和“希望”成了越来越多国内企业和消费者的直接感受,与此同时,国际经济也从疫情中缓慢“恢复”过来,特斯拉在中国区掀起了新一轮降价风潮,而行业“销冠”比亚迪却高调发布了百万级新车。如同晴…

websocket显示实时消息

websocket实现实时消息展示 前面介绍过websocket聊天功能的实现,不清楚的可以先看下 websocket实现在线聊天 https://blog.csdn.net/qq_51076413/article/details/124644500 之前发过websocket的相关使用和一对一聊天的demo代码,这里是针对上几篇文章的补充&#x…

Nacos服务注册与发现源码剖析

文章目录前提介绍Nacos源码下载Nacos客户端源码Spring Cloud Starter Nacos 源码Nacos服务端源码前提介绍 服务注册与发现作用主要是为了更好的管理众多的服务,不论Nacos还是Zookeeper、Eureka,作为注册中心都是为了解决以下两个问题: 屏蔽…

【论文写作】英文写作工具推荐及使用教程:DeepL(翻译) + EasyEssay(扩写) + QuillBot(改写润色)

文章目录一、DeepL二、EasyEssay2.1 润写2.2 扩写2.3 生成文章2.4 英文查重三、QuillBot一、DeepL DeepL官网 DeepL的主要作用是翻译,一开始我也是在B站上看到有人推荐用这款翻译工具的,抱着试一试的心态去用了一下,感觉翻译效果真的很不错&a…