django DRF增删改查查

 

        使用Django的DRF框架,基于restful接口规范的增删改查(查所有)查(查一个)操作,一般默认有如下规范:

/book/  GET 查看所有资源,返回所有资源; /book/  POST 添加资源,返回添加的资源;

/book/1 GET 查看某一个资源,返回这一个资源;

/book/1 PUT 编辑某一个资源,返回编辑之后的这个资源;

/book/1 DELETE 删除某一个资源,返回空;

一、基于APIView实现

1、urls.py

urlpatterns = [path('sers/book/', views.BookView.as_view()),re_path('sers/book/(\d+)', views.BookDetailView.as_view()),
]

2、models.py

class Book(models.Model):title = models.CharField(verbose_name="书籍名称",max_length=32)price = models.IntegerField(verbose_name="价格",null=True)  #如果不设置null,数据库默认是不能为空的;pub_data = models.DateField(verbose_name="出版时间")

3、views.py

# 针对模型设计序列化器
class BookSerializers(serializers.Serializer):title = serializers.CharField(max_length=32)price = serializers.IntegerField(required=False)pub_data = serializers.DateField()# 字段名要和models中的名字一致,不然会报错,如果需要自定义需要通过如下方法:# data = serializers.DateTimeField(source="pub_data")# seve方法重写def create(self, validated_data):# 添加数据逻辑new_book = Book.objects.create(**self.validated_data)return new_bookdef update(self, instance, validated_data):# 更新逻辑Book.objects.filter(pk=instance.pk).update(**validated_data)# 针对更新加的两句话,区分instanceupdated_book = Book.objects.get(pk=instance.pk)return updated_bookclass BookView(APIView):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):'''添加书籍'''# 获取请求数据data = request.data# 构建序列化器对象serializer = BookSerializers(data=request.data)# 校验数据:返回布尔值,serializer.validated_data ,在这里校验,如果不通过,保存到这里serializer.errorsif serializer.is_valid():# 数据校验通过,将数据插入到数据库中# new_book= Book.objects.create(**serializer.validated_data)serializer.save()return Response(serializer.data)else:# 校验失败return Response(serializer.errors)class BookDetailView(APIView):def get(self,request,id):'''查某一个'''book = Book.objects.get(pk=id)  #模型类对象和queryset对象serializer = BookSerializers(instance=book,many=False)return Response(serializer.data)def put(self,request,id):'''编辑某一个数据,更新数据'''# 找到需要编辑的对象up_book = Book.objects.get(pk=id)# 构建序列化对象,这里instance和data这两个参数都要有;serializer = BookSerializers(instance=up_book,data=request.data)# 数据校验,反序列化if serializer.is_valid():serializer.save()return Response(serializer.data)else:return Response(serializer.errors)def delete(self,request,id):# 删除Book.objects.get(pk=id).delete()return Response()

4、针对views.py中的模型序列化器,还有以下更简便的写法,这个里面的create和update方法都自动被写好了,不用自己定义,自己只设置字段就可以了。

class BookSerializers(serializers.ModelSerializer):class Meta:model = Bookfields = "__all__"# fields = ["title", "price"]# exclude = ["pub_date"]

二、基于GenericAPIView的接口实现

GenericAPIView是继承的APIView,然后又实现了一些自定义的方法。

1、urls.py

    path('sers/publish/', views.PublishView.as_view()),# ?p<pk> 有名分组,这样写之后会行成 pk=\d 的形式re_path('sers/publish/(?P<pk>\d+)', views.PublishDetailView.as_view()),

2、models.py

class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=32)

3、views.py

from rest_framework.generics import GenericAPIViewclass PublishSerializers(serializers.ModelSerializer):class Meta:model = Publishfields = "__all__"class PublishView(GenericAPIView):# 定义2个类全局变量;以后复用这个类的时候,只改两个全局变量;queryset = Publish.objects.all()serializer_class = PublishSerializersdef get(self,request):'''查看所有'''serializer = self.get_serializer(instance=self.get_queryset(),many=True)return Response(serializer.data)def post(self,request):'''添加'''serializer = self.get_serializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data)else:return Response(serializer.errors)class PublishDetailView(GenericAPIView):# 定义2个类全局变量;以后复用这个类的时候,只改两个全局变量;queryset = Publish.objects.all()serializer_class = PublishSerializersdef get(self,request,pk):  # pk要对应URL中,pk在源码中可以改,不建议改;'''查一个'''serializer = self.get_serializer(instance=self.get_object(), many=False)return Response(serializer.data)def put(self,request,pk):'''编辑'''serializer = self.get_serializer(instance=self.get_object(),data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data)else:return Response(serializer.errors)def delete(self,request,pk):'''删除'''self.get_object().delete()return Response()

三、基于Mixin的接口实现 

1、urls.py

    path('sers/publish/', views.PublishView.as_view()),# ?p<pk> 有名分组,这样写之后会行成 pk=\d 的形式re_path('sers/publish/(?P<pk>\d+)', views.PublishDetailView.as_view()),

2、models.py

class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=32)

3、 views.py

from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,DestroyModelMixinclass PublishSerializers(serializers.ModelSerializer):class Meta:model = Publishfields = "__all__"class PublishView(ListModelMixin,CreateModelMixin,GenericAPIView):# 定义2个类全局变量;以后复用这个类的时候,只改两个全局变量;queryset = Publish.objects.all()serializer_class = PublishSerializersdef get(self,request):'''查看所有'''# list()方法来源于父类ListModelMixin中的方法return self.list(request)def post(self,request):'''添加'''# create()方法来源于父类CreateModelMixin中的方法return self.create(request)class PublishDetailView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):# 定义2个类全局变量;以后复用这个类的时候,只改两个全局变量;queryset = Publish.objects.all()serializer_class = PublishSerializersdef get(self,request,pk):'''查一个'''# retrieve()方法来源于父类RetrieveModelMixin中的方法return self.retrieve(request,pk)def put(self,request,pk):'''编辑'''# update()方法来源于父类UpdateModelMixin中的方法return self.update(request,pk)def delete(self,request,pk):'''删除'''# destroy()方法来源于父类DestroyModelMixin中的方法return self.destroy(request,pk)

4、对于views.py中,Mixin类再封装的操作

# ListCreateAPIView 封装了ListModelMixin,CreateModelMixin,GenericAPIView三个类,和get/post两个方法;
# RetrieveUpdateDestroyAPIView 封装了RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView四个类,实现了get/put/delete三个方法;
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIViewclass PublishSerializers(serializers.ModelSerializer):class Meta:model = Publishfields = "__all__"class PublishView(ListCreateAPIView):# get/post方法全部在ListCreateAPIView中,不用自己写;queryset = Publish.objects.all()serializer_class = PublishSerializers# 有的情况下,一个接口不见得会全部要增删改查查,也许只有查看和编辑,不允许删除,还有类可以继承RetrieveUpdateAPIView
class PublishDetailView(RetrieveUpdateDestroyAPIView):# get/put/delete方法全部在RetrieveUpdateDestroyAPIView中,不用自己写;queryset = Publish.objects.all()serializer_class = PublishSerializers

 

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

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

相关文章

Mac M3 芯片安装 Nginx

Mac M3 芯片安装 Nginx 一、使用 brew 安装 未安装 brew 的可以参考 【Mac 安装 Homebrew】 或者 【Mac M2/M3 芯片环境配置以及常用软件安装-前端】 二、查看 nginx 信息 通过命令行查看 brew info nginx可以看到 nginx 还未在本地安装&#xff0c;显示 Not installed …

k8s之Helm

理论&#xff1a; 什么是 He lm 在没使用 helm 之前&#xff0c;向 kubernetes 部署应用&#xff0c;我们要依次部署 deployment、svc 等&#xff0c;步骤较繁琐。 况且随着很多项目微服务化&#xff0c;复杂的应用在容器中部署以及管理显得较为复杂&#xff0c;helm 通过打包…

k8s的error: metrics not available yet问题处理

kubectl top node报错处理 解决步骤环境说明问题现象初次排查问题解决版本兼容性metric-server.yaml 问题验证 解决步骤 因项目要求&#xff0c;需在k8s集群中使用 kubectl top node命令&#xff0c;但是一直报error: metrics not available yet错误。为了更好的复现问题&…

关于“谈谈你对 ES 的理解”

普通人 它是一个基于 Apache Lucene 开源的一个分布式搜索引擎框架。 一般用它来做 ● 日志记录和分析 ● 公共数据采集 ● 全文检索 ● 数据可视化分析等等 高手 Elasticsearch &#xff0c;简称 ES 。它是建立在全文搜索引擎库 Apache Lucene 基础之上的一个开源的搜索…

sql统计某列数据出现最多的一个id

SELECT column_name, COUNT(column_name) AS occurrence_count FROM your_table GROUP BY column_name ORDER BY occurrence_count DESC LIMIT 1; 用来展示

css的预处理

CSS的预处理器是一种CSS的扩展&#xff0c;可以让开发者使用更加高效、灵活的方式来编写CSS代码。 常用的CSS预处理器包括&#xff1a; Sass&#xff1a;基于Ruby的CSS预处理器&#xff0c;提供了大量的函数和变量等扩展功能。 Less&#xff1a;基于JavaScript的CSS预处理器&…

数据结构-时间复杂度与空间复杂度详解

文章目录 算法效率时间复杂度概念计算例1例2例3补充例4 空间复杂度例1例2 算法效率 算法效率分析分为两种:第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。时间复杂度主要衡量的是一个算法的运行速度&#…

新一轮SocialFi浪潮来袭,Atem Network 再次打响注意力争夺战

火爆如潮的 Atem Network 再次从 CyberConnect 以及 Friend.tech 手中接过 SocialFi 赛道的热度大棒&#xff0c;同时这也表明&#xff0c;协议层仍将是 Web3 社交领域的主要叙事。 前不久&#xff0c;Web3社交协议Atem Network 在白皮书中披露了ATEM的代币经济模型&#xff0c…

php费尔康框架phalcon(费尔康)框架学习笔记

phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里&#xff0c;推荐php版本>5.4) 环境不支持伪静态网址时的配置 第一步&#xff1a; 在app\config\config.ini文件中的[application]节点内修改baseUri参数值为/invo/index.php/或…

[运维工具]ubuntu下迁移home目录至新的分区教程详解

ubuntu下迁移home目录至新的分区教程详解 前言 首先声明一下&#xff0c;因为此教程涉及到用户重要资料数据&#xff0c;所以操作前&#xff1a; 数据无价&#xff0c;请一定要先备份&#xff01;数据无价&#xff0c;请一定要先备份&#xff01;数据无价&#xff0c;请一定…

牛客网刷题笔记231112 最小k位数+二叉树层序遍历+SQL异常邮件概率

算法题牛客网NC119 最小的k个数 题目&#xff1a; 用了一下python列表的便利&#xff0c;不知道在面试时允许用不。当然最简单的方法其实是直接sort()一下取前k位数即可。本次写的思路如下&#xff1a; 用一个最大容量为k的列表存储结果&#xff0c;遍历n个元素&#xff0c;当…

技术架构 - 应用数据分离,应用服务集群架构

前言 上一篇文章介绍了单机架构&#xff0c;由于性能瓶颈&#xff0c;满足不了高访问量&#xff0c;所以演化出了数据分离架构。 这种架构也很简单只是将应用服务和数据库服务分离开来&#xff0c;避免单一架构的资源争夺的情况。 一、 应用数据分离架构 1. 简介 应用服务和…

ChatGPT助力高效办公——神奇的效率工具Airy

Airy是一款免费而又强大的高效办公软件&#xff0c;用户可以通过快捷键和丰富的内置插件&#xff0c;充分发挥GPT-3.5模型的强大功能&#xff0c;轻松实现搜索、翻译、文本生成与写作、文本概括与总结&#xff0c;同时还可以作为一款日程提醒工作&#xff0c;记录和提醒每天要做…

现场直击!触想智能亮相德国2023 SPS展会

当地时间11月14日上午9时 2023 年(德国)纽伦堡国际工业自动化及元器件展览会 SPS 展(以下简称&#xff1a;SPS展会)正式拉开帷幕&#xff0c;触想智能与来自全球各地的领先科技公司及前沿业者齐聚盛会&#xff0c;共赴一场科技与创新交汇的“饕餮盛宴”。 △ 2023 SPS展会开幕(…

初识VBA代码及应用VBA代码第四节:如何录制宏

《VBA之Excel应用》&#xff08;10178983&#xff09;是非常经典的&#xff0c;是我推出的第七套教程&#xff0c;定位于初级&#xff0c;目前是第一版修订。这套教程从简单的录制宏开始讲解&#xff0c;一直到窗体的搭建&#xff0c;内容丰富&#xff0c;实例众多。大家可以非…

NSSCTF第12页(1)

[FSCTF 2023]细狗2.0 应该是和[HUBUCTF 2022 新生赛]ezsql搞混掉了 点击按钮出现了 发现输入什么回显什么 伪协议也不行 看源代码发现了这个玩意 输入了1;发现了其他回显 ls 发现了两个文件 发现被限制了 不知道是cat还是空格 绕过 直接找吧还是 得到flag [SCTF 2021]loginm…

系列八、Mybatis一对多查询,只查询出了一条记录

一、Mybatis一对多查询&#xff0c;只查询出了一条记录 1.1、问题说明 典型的权限管理框架的数据库表中&#xff0c;一般会存在这样3种角色的表&#xff0c;即用户表、角色表、用户角色关联表&#xff0c;表设计好之后&#xff0c;往这三张表中初始化了一些测试数据&#xff0…

前端 JavaScript 数组相关知识点有哪些?

JavaScript 中的数组是一种数据结构&#xff0c;用于存储一系列值。在前端开发中&#xff0c;数组是一种常见的数据类型&#xff0c;经常用于存储和处理数据。以下是一些前端 JavaScript 数组相关的知识点&#xff1a; 1、数组的定义和声明 在 JavaScript 中&#xff0c;可以…

Debezium-Embedded 实时监控MySQL数据变更

1.Debezium-Embedded 简介 Debezium连接器的操作通常是将它们部署到Kafka Connect服务&#xff0c;并配置一个或多个连接器来监控上游数据库&#xff0c;并为它们在上游数据库中看到的所有更改生成数据更改事件。这些数据更改事件被写入Kafka&#xff0c;在那里它们可以被许多不…

Flutter.源码分析.flutter/packages/flutter/lib/src/widgets/scroll_view.dart/GridView

Flutter.源码分析 GridView flutter/packages/flutter/lib/src/widgets/scroll_view.dart/GridView 李俊才 的个人博客&#xff1a;https://blog.csdn.net/qq_28550263 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134375048 本文提供 Flutter 框…