DRF的View类视图
目录
1.准备工作
2.APIView的使用
3.使用generics生成类视图
4.使用ViewSet生成类视图
1.准备工作
(1).做一个简单的model类
在models.py中制作一个很简单的一个图书模型类,有书名,作者和价钱
from django.db import models# Create your models here.
class Book(models.Model):name = models.CharField(max_length=12, verbose_name="书名")author = models.CharField(max_length=24, verbose_name="作者")price = models.FloatField(default=0, verbose_name="价格")create_date = models.DateField(verbose_name="创建时间", auto_now_add=True)update_date = models.DateField(verbose_name="更新时间", auto_now=True)
(2).做一个序列化器
新建一个serializer.py文件,直接使用ModelSerializer制作一个序列化器
from rest_framework.serializers import ModelSerializer
from .models import Bookclass BookSerializer(ModelSerializer):class Meta:model = Bookfields = '__all__'def create(self, validated_data):Book.objects.create(**validated_data)return validated_datadef update(self, instance, validated_data):instance["name"] = validated_data.get("name")instance["author"] = validated_data.get("author")instance["price"] = validated_data.get("price")instance.save()return instance
(3).准备
修改seting.py的数据库配置,生成迁移文件,然后开始view视图的编写
2.APIView的使用
通过APIView生成单查(一般详情页),群查(一般列表页)接口,还有增删改三个接口
from rest_framework.views import APIView
from .serializers import BookSerializer
from .models import Book
from rest_framework.response import Responseclass BookView(APIView):def get(self, request, pk=None):if pk:book = Book.objects.filter(pk=pk)else:book = Book.objects.all()ser = BookSerializer(instance=book, many=True)return Response(ser.data)def post(self, request):data = request.dataser = BookSerializer(data=data)ser.is_valid(raise_exception=True)ser.save()return Response({"msg": "ok", "data": data})def put(self, request, pk=None):data = request.databook = Book.objects.get(pk=pk)bs = BookSerializer(instance=book, data=data)bs.is_valid(raise_exception=True)bs.save()return Response({"msg": "ok"})def delete(self, request, pk):Book.objects.get(pk=pk).delete()return Response({"msg": "ok"})
3.使用generics生成类视图
上面通过APIView生成了一个具有增删改,单查,群查的功能的类视图,可以看到有很多代码都是重复代码,所以这个时候generics的类视图就出现了,可以简化开发过程
from rest_framework.generics import ListAPIView, DestroyAPIView, UpdateAPIView, CreateAPIViewclass BookView(ListAPIView, DestroyAPIView, UpdateAPIView, CreateAPIView):queryset = Book.objects.all()serializer_class = BookSerializer
只需要4行代码就可以完成增删改查的操作,因为ListAPIView和RetrieveAPIView是同时封装的get方法,所以正常情况下没有办法同时调用,这个时候需要我们可以重写get_queryset方法,实现对ListAPIView和RetrieveAPIView同时调用
class BookView(ListAPIView, DestroyAPIView, UpdateAPIView, CreateAPIView, RetrieveAPIView):queryset = Book.objects.all()serializer_class = BookSerializerdef get_queryset(self):pk = self.kwargs.get("pk")queryset = self.querysetif pk:queryset = Book.objects.filter(pk=pk)if isinstance(queryset, QuerySet):queryset = queryset.all()return queryset
4.使用ViewSet生成类视图
因为上面的两个视图,单查和群查都是get请求,写的会比较乱,所以ViewSET出现解决了这个问题,首先修改一下视图类,如下图,我们把单查单独做成了一个函数
from rest_framework.viewsets import ViewSet
from rest_framework.response import Responseclass BookView(ViewSet):def list(self, request):book = Book.objects.all()ser = BookSerializer(instance=book, many=True)return Response(ser.data)def retrieve(self, request, pk):book = Book.objects.filter(pk=pk)ser = BookSerializer(instance=book, many=True)return Response(ser.data)def create(self, request):data = request.dataser = BookSerializer(data=data)ser.is_valid(raise_exception=True)ser.save()return Response({"msg": "ok", "data": data})def update(self, request, pk):data = request.databook = Book.objects.get(pk=pk)bs = BookSerializer(instance=book, data=data)bs.is_valid(raise_exception=True)bs.save()return Response({"msg": "ok"})def destroy(self, request, pk):Book.objects.get(pk=pk).delete()return Response({"msg": "ok"})
光修改视图还是不够的,还需要修改一下路由
from django.urls import path, re_path
from .views import BookViewurlpatterns = [path("BookView/", BookView.as_view({"get": "list", "post": "create"})),re_path(r"BookView/(?P<pk>\d+)", BookView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"}))
]
上面既然可以把单查单独做成一个函数了,所以我们就可以直接通过继承来完成所有的功能,甚至都不需要重写什么东西
class BookView(ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer
顺便可以通过drf提供的路由,对urls.py进行一个简化
from .views import BookView
from rest_framework import routersrouter = routers.SimpleRouter()
router.register(r"BookView", BookView)urlpatterns = []
urlpatterns += router.urls
DRF的View类视图相关推荐
- [django] View类视图
View--所有类视图的父类 View是所有类视图的父类,包括在之后使用的最重要的DjangoRESTframework中的所有view,都是继承于它.View可以直接从from django.vie ...
- Django的类视图和中间件
类视图 1 类视图引入 以函数的方式定义的视图称为函数视图,函数视图便于理解.但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性 ...
- Django框架——类视图
目录 1.类视图的使用 2.类视图装饰器的使用 1.类视图的使用 继承View类,通过不同的请求方式定义不同的函数. 类视图的好处: (1)代码可读性好 (2)类视图相对于函数视图有更高的复用性 , ...
- Drf从入门到精通四(Drf请求与响应、Drf能够解析的请求编码与响应编码、Drf视图、Drf视图基类)
文章目录 一.Drf请求与响应 1.Request类和Response类 2.Drf能够解析的请求编码与相应编码 二.Drf视图组件 四.Drf视图基类 1.基于APIView写5个接口 2.基于Ge ...
- as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]
系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...
- 【django】类视图
以函数的⽅式定义的视图称为函数视图,函数视图便于理解.但是遇到⼀个视图对应的路径提供了多种不同HTTP请求⽅式的⽀持时,便需要在⼀个函数中编写不同的业务逻辑,代码可读性与复⽤性都不佳. 一.类视图使⽤ ...
- Django从理论到实战(part46)--View类
学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 类视图 View类 django.views.generic.base.View是主要的类视图,所有的类视图都是继 ...
- Django的View(视图)
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- Diango博客--13.将“视图函数”类转化为“类视图”
文章目录 0.思路引导 1.ListView 2.将 index 视图函数改写为类视图 3.将 category 视图函数改写为类视图 4.将 archive 视图函数改写成类视图 5.将 tag 视 ...
最新文章
- 基础 HTML之目录问题(相对路径和绝对路径区别)
- 千万不要一辈子靠技术生存
- mysql+join+分库分表_MySQL分库分表篇
- ICCV 2019 | 通过多标签相关性研究提升神经网络视频分类能力
- python assert函数
- python多目标优化_多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码...
- hdu 5076 最小割灵活运用
- Android 10上的F2FS文件系统制作
- 中文三元组联合标注工具LAnn介绍
- 腾达n318虚拟服务器,腾达N318无线路由器的设置教程
- mac电脑怎么彻底删除卸载桌面软件图标的软件?
- ps中怎么导出tif_PS中图像常用的2种存储格式——TIFF/JPEG
- 今年双旦期间简直人品爆棚,晒晒我抽中的趣享付趣号卡
- HTML的基本结构标签(html,head,title,body)
- 原生js方法购物车完整实现 利用localStorage
- 转载:廖雪峰经典:史上最浅显易懂的Git教程!
- 摄像机sensor介绍
- pandas爬取数据示例网页
- 用百度 Doodle 记录的2018
- 【案例】建设银行——直播中台助力企业数字化学习升级