引言

在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方。这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑。

视图组件

使用视图组件的mixin优化接口逻辑

  1. 导入 mixins
  2. 定义序列化类
  3. 定义视图类
  1. # 1.导入mixins
  2. from rest_framework.mixins import (
  3. ListModelMixin,
  4. CreateModelMixin,
  5. DestroyModelMixin,
  6. UpdateModelMixin,
  7. RetrieveModelMixin
  8. )
  9. from rest_framework.generics import GenericAPIView
  10.  
  11. from DrfOne import models
  12. # 2.定义序列化类
  13. from DrfOne.drf_serializers import BookSerializer
  14.  
  15. # 3.定义视图类
  16. class BookView(ListModelMixin, CreateModelMixin, GenericAPIView):
  17. # 获取数据源, 固定写法
  18. queryset = models.Book.objects.all()
  19. # 序列化类, 固定写法
  20. serializer_class = BookSerializer
  21. def get(self, request, *args, **kwargs):
  22. return self.list(request, *args, **kwargs)
  23.  
  24. def post(self, request, *args, **kwargs):
  25. return self.create(request, *args, **kwargs)
  26.  
  27. class BookFilterView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
  28. # 获取数据源, 固定写法
  29. queryset = models.Book.objects.all()
  30. # 序列化类, 固定写法
  31. serializer_class = BookSerializer
  32.  
  33. def get(self, request, *args, **kwargs):
  34. return self.retrieve(request, *args, **kwargs)
  35.  
  36. def put(self, request, *args, **kwargs):
  37. return self.update(request, *args, **kwargs)
  38.  
  39. def delete(self, request, *args, **kwargs):
  40. return self.destroy(request, *args, **kwargs)

定义序列化类

  1. from rest_framework import serializers
  2.  
  3. from DrfOne import models
  4.  
  5. class BookSerializer(serializers.ModelSerializer):
  6. class Meta:
  7. model = models.Book
  8. fields = "__all__"
  9. extra_kwargs = {
  10. # 仅写
  11. "publish": {'write_only': True},
  12. "authors": {'write_only': True},
  13. }
  14.  
  15. publish_name = serializers.CharField(max_length=32, read_only=True, source="publish.name")
  16. publish_address = serializers.CharField(max_length=32, read_only=True, source="publish.address")
  17. author_name = serializers.SerializerMethodField()
  18.  
  19. def get_author_name(self, book_obj):
  20. author_list = list()
  21. for author in book_obj.authors.all():
  22. # 注意列表添加字段,author.name而不是author
  23. author_list.append(author.name)
  24. return author_list

注意:操作单条数据的 url

  1. from django.urls import path, re_path
  2.  
  3. from DrfOne import views
  4.  
  5. urlpatterns = [
  6. path('books/', views.BookView.as_view()),
  7. # 需要命名为pk
  8. re_path("books/(?P<pk>\d+)/", views.BookFilterView.as_view()),
  9. ]

通过上面代码发现 get , post 等方法内容相似,可以进行再次封装。

使用视图组件的view优化接口逻辑

  1. 导入 generics
  2. 导入序列化类
  3. 定义视图类

对 mixins 再次优化其余内容不变

  1. # 1.导入generics
  2. from rest_framework import generics
  3.  
  4. from DrfOne import models
  5. # 2.导入序列化类
  6. from DrfOne.drf_serializers import BookSerializer
  7.  
  8. # 3.定义视图类
  9. class BookView(generics.ListCreateAPIView):
  10. # 获取数据源, 固定写法
  11. queryset = models.Book.objects.all()
  12. # 序列化类, 固定写法
  13. serializer_class = BookSerializer
  14.  
  15. class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
  16. queryset = models.Book.objects.all()
  17. serializer_class = BookSerializer

发现还是有重复代码,再次优化,也就是 viewset 。

使用视图组件的viewset优化接口逻辑

看似已经优化的非常完美了,但是在一个对性能要求极高的项目里面,我们的程序还可以继续优化,不断的优化程序是每个程序员必备的技能。

  1. 定义 url
  2. 导入 viewset
  3. 导入序列化类
  4. 定义视图类

注意urls.py的变化

  1. from django.urls import path, re_path
  2.  
  3. from DrfOne import views
  4.  
  5. urlpatterns = [
  6. # path('books/', views.BookView.as_view()),
  7. # re_path("books/(?P<pk>\d+)/", views.BookFilterView.as_view()),
  8.  
  9. path("books/", views.BookView.as_view({
  10. "get": "list",
  11. "post": "create",
  12. })),
  13. re_path('books/(?P<pk>\d+)/', views.BookView.as_view({
  14. 'get': 'retrieve',
  15. 'put': 'update',
  16. 'delete': 'destroy'
  17. })),
  18. ]

views.py

  1. # 2.导入viewset模块里的ModelViewSet类
  2. from rest_framework.viewsets import ModelViewSet
  3.  
  4. # 导入应用里的models
  5. from DrfOne import models
  6. # 3.导入序列化类
  7. from DrfOne.drf_serializers import BookSerializer
  8.  
  9. # 4.定义视图类
  10. class BookView(ModelViewSet):
  11. # 获取数据源, 固定写法
  12. queryset = models.Book.objects.all()
  13. # 序列化类, 固定写法
  14. serializer_class = BookSerializer

~>.<~

DRF Django REST framework 之 视图组件(四)的更多相关文章

  1. DRF Django REST framework 之 认证组件(五)

    引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...

  2. 轻轻松松学会 DRF Django REST framework

    据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...

  3. Django Rest framework 之 视图

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  4. DRF Django REST framework APIView(一)

    什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...

  5. django rest framework 解析器组件 接口设计,视图组件 (1)

    一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.d ...

  6. django rest framework 解析器组件 接口设计,视图组件 (2)

    1. 使用视图组件进行接口优化 1.1 使用视图组件的mixin进行接口逻辑优化 - 导入mixin from rest_framework.mixinx import ( ListModelMix, ...

  7. Django Rest Framework源码剖析(四)-----API版本

    一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...

  8. DRF Django REST framework 之 解析器(二)

    引入 Django Rest framework帮助我们实现了处理application/json协议请求的数据,如果不使用DRF,直接从 request.body 里面拿到原始的客户端请求的字节数据 ...

  9. DRF (Django REST framework) 中的Request 与 Response

    DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...

随机推荐

  1. 「Luogu 3792」由乃与大母神原型和偶像崇拜

    更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...

  2. 『题解』Codeforces1142A The Beatles

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently a Golden Circle of Beetlovers ...

  3. day2-day3基本数据类型专区

    一.基本数据类型 1.字符串 str (用''or“”表示) 字符串中每个组成部分为字符,python中只要是用引号引起来的都叫字符串 ---特征: 加法 n1 = "alex" ...

  4. javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: ResultSet is from UPDATE. No Data.

    Java jpa调用存储过程,抛出异常如下: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCEx ...

  5. hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)

    统计难题Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submis ...

  6. Anaconda 笔记

    Anaconda笔记 conda 功能 管理版本的切换 安装其他的包 conda 创建python27环境 conda create --name python27 python=2.7 conda ...

  7. python:timeit模块

    (鱼c)timeit模块详解——准确测量小段代码的执行时间 http://bbs.fishc.com/forum.php?mod=viewthread&tid=55593&extra= ...

  8. Easy 2048 Again(状压dp)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3802 题意: 从数列A中, 删除若干个数(可以0个), 是删除 ...

  9. windows下搭建dubbo 环境(dubbo-admin和服务提供者消费者)

    ---恢复内容开始--- 一.  dubbo-admin管理控制台 从 https://github.com/apache/dubbo-admin clone项目到本地. 修改dubbo-admin- ...

  10. PostGIS 安装教程(Linux)(二)

    ##接上篇,上篇讲述了Postgresql的安装,此篇介绍postgis的安装 ##附上上篇链接:https://www.cnblogs.com/giser-s/p/11195419.html 二.安 ...