目录

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类视图相关推荐

  1. [django] View类视图

    View--所有类视图的父类 View是所有类视图的父类,包括在之后使用的最重要的DjangoRESTframework中的所有view,都是继承于它.View可以直接从from django.vie ...

  2. Django的类视图和中间件

    类视图 1 类视图引入 以函数的方式定义的视图称为函数视图,函数视图便于理解.但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性 ...

  3. Django框架——类视图

    目录 1.类视图的使用 2.类视图装饰器的使用 1.类视图的使用 继承View类,通过不同的请求方式定义不同的函数. 类视图的好处: (1)代码可读性好 (2)类视图相对于函数视图有更高的复用性 , ...

  4. Drf从入门到精通四(Drf请求与响应、Drf能够解析的请求编码与响应编码、Drf视图、Drf视图基类)

    文章目录 一.Drf请求与响应 1.Request类和Response类 2.Drf能够解析的请求编码与相应编码 二.Drf视图组件 四.Drf视图基类 1.基于APIView写5个接口 2.基于Ge ...

  5. as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]

    系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...

  6. 【django】类视图

    以函数的⽅式定义的视图称为函数视图,函数视图便于理解.但是遇到⼀个视图对应的路径提供了多种不同HTTP请求⽅式的⽀持时,便需要在⼀个函数中编写不同的业务逻辑,代码可读性与复⽤性都不佳. 一.类视图使⽤ ...

  7. Django从理论到实战(part46)--View类

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 类视图 View类 django.views.generic.base.View是主要的类视图,所有的类视图都是继 ...

  8. Django的View(视图)

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  9. Diango博客--13.将“视图函数”类转化为“类视图”

    文章目录 0.思路引导 1.ListView 2.将 index 视图函数改写为类视图 3.将 category 视图函数改写为类视图 4.将 archive 视图函数改写成类视图 5.将 tag 视 ...

最新文章

  1. 基础 HTML之目录问题(相对路径和绝对路径区别)
  2. 千万不要一辈子靠技术生存
  3. mysql+join+分库分表_MySQL分库分表篇
  4. ICCV 2019 | 通过多标签相关性研究提升神经网络视频分类能力
  5. python assert函数
  6. python多目标优化_多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码...
  7. hdu 5076 最小割灵活运用
  8. Android 10上的F2FS文件系统制作
  9. 中文三元组联合标注工具LAnn介绍
  10. 腾达n318虚拟服务器,腾达N318无线路由器的设置教程
  11. mac电脑怎么彻底删除卸载桌面软件图标的软件?
  12. ps中怎么导出tif_PS中图像常用的2种存储格式——TIFF/JPEG
  13. 今年双旦期间简直人品爆棚,晒晒我抽中的趣享付趣号卡
  14. HTML的基本结构标签(html,head,title,body)
  15. 原生js方法购物车完整实现 利用localStorage
  16. 转载:廖雪峰经典:史上最浅显易懂的Git教程!
  17. 摄像机sensor介绍
  18. pandas爬取数据示例网页
  19. 用百度 Doodle 记录的2018
  20. 【案例】建设银行——直播中台助力企业数字化学习升级

热门文章

  1. 大牛是怎么炼成的?(转载自微信公众号 -- 码农翻身)
  2. 用myeclipse编写css,myeclipse怎么用css
  3. C Primer Plus 第六版 编程练习第四章答案 最新出炉
  4. 日系车集体溃败新能源,不止中国市场!
  5. cesium天气系统
  6. php ms2,wordpress主题:芒果小站主题(M2)重构版
  7. linux cp进行目录拷贝,目的路径下存在同名目录情况下出现的问题
  8. Referer请求头
  9. iphone4S wifi变灰,无法连接无线的解决办法, 神奇的办法:iOS6耗电WiFi变灰问题解决
  10. 云监控站点监控报警异常