引言

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

视图组件

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

  1. 导入 mixins
  2. 定义序列化类
  3. 定义视图类
# 1.导入mixins
from rest_framework.mixins import (
ListModelMixin,
CreateModelMixin,
DestroyModelMixin,
UpdateModelMixin,
RetrieveModelMixin
)
from rest_framework.generics import GenericAPIView from DrfOne import models
# 2.定义序列化类
from DrfOne.drf_serializers import BookSerializer # 3.定义视图类
class BookView(ListModelMixin, CreateModelMixin, GenericAPIView):
# 获取数据源, 固定写法
queryset = models.Book.objects.all()
# 序列化类, 固定写法
serializer_class = BookSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs) class BookFilterView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
# 获取数据源, 固定写法
queryset = models.Book.objects.all()
# 序列化类, 固定写法
serializer_class = BookSerializer def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)

定义序列化类

from rest_framework import serializers

from DrfOne import models

class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = "__all__"
extra_kwargs = {
# 仅写
"publish": {'write_only': True},
"authors": {'write_only': True},
} publish_name = serializers.CharField(max_length=32, read_only=True, source="publish.name")
publish_address = serializers.CharField(max_length=32, read_only=True, source="publish.address")
author_name = serializers.SerializerMethodField() def get_author_name(self, book_obj):
author_list = list()
for author in book_obj.authors.all():
# 注意列表添加字段,author.name而不是author
author_list.append(author.name)
return author_list

注意:操作单条数据的 url

from django.urls import path, re_path

from DrfOne import views

urlpatterns = [
path('books/', views.BookView.as_view()),
# 需要命名为pk
re_path("books/(?P<pk>\d+)/", views.BookFilterView.as_view()),
]

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

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

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

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

# 1.导入generics
from rest_framework import generics from DrfOne import models
# 2.导入序列化类
from DrfOne.drf_serializers import BookSerializer # 3.定义视图类
class BookView(generics.ListCreateAPIView):
# 获取数据源, 固定写法
queryset = models.Book.objects.all()
# 序列化类, 固定写法
serializer_class = BookSerializer class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Book.objects.all()
serializer_class = BookSerializer

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

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

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

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

注意urls.py的变化

from django.urls import path, re_path

from DrfOne import views

urlpatterns = [
# path('books/', views.BookView.as_view()),
# re_path("books/(?P<pk>\d+)/", views.BookFilterView.as_view()), path("books/", views.BookView.as_view({
"get": "list",
"post": "create",
})),
re_path('books/(?P<pk>\d+)/', views.BookView.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})),
]

views.py

# 2.导入viewset模块里的ModelViewSet类
from rest_framework.viewsets import ModelViewSet # 导入应用里的models
from DrfOne import models
# 3.导入序列化类
from DrfOne.drf_serializers import BookSerializer # 4.定义视图类
class BookView(ModelViewSet):
# 获取数据源, 固定写法
queryset = models.Book.objects.all()
# 序列化类, 固定写法
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. p1594(巨坑题!!!)

    护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是一条单行道,所以任何车辆都不能超车.桥能承受一个给定的最大承载量.为了控制桥上的交通,桥两边各站一个指挥员.护卫车队被分成几个组, ...

  2. 伪紫题p5194 天平(dfs剪枝)

    这题作为一个紫题实在是过分了吧...绿的了不起了.—————————————————————————— 看题第一眼,01背包无误.2min打好一交全屏紫色(所以这就是这题是紫色的原因233?) re原 ...

  3. 「CF630C」Lucky Numbers

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description The numbers of all offices in the new ...

  4. mpvue+小程序云开发,纯前端实现婚礼邀请函(相册小程序)

    请勿使用本文章及源码作为商业用途! 前言 当初做这个小程序是为了婚礼前的需要,结婚之后,希望这个小程序能够留存下来,特地花了一些空闲时间将小程序转化成为“相册类小程序” 体验码 准备工作 mpvue框 ...

  5. 大宇java面试系列(二):jvm组成部分

    1. 说一下 JVM 的主要组成部分?及其作用? 类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库接口(Na ...

  6. (C#)WPF:LinearGradientBrush 线性渐变画刷和RadialGradientBrush 圆形渐变画刷

    <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...

  7. ZeroC ICE的远程调用框架 ASM与defaultServant,ServantLocator

    ASM与defaultServant,ServantLocator都是与调用调度(Dispatch)相关的. ASM是ServantManager中的一张二维表_servantMapMap,默认Ser ...

  8. 分析facebook的AsyncDisplayKit框架中的Transaction的工作原理

    在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现. 主要目的是将operat ...

  9. 使用shiro做权限管理的学习笔记整理

    Shiro权限管理 参考:https://www.cnblogs.com/jpfss/p/8352031.html Shiro解决的问题 授权和鉴别的问题:Authenrization(授权) Aut ...

  10. opencv resize图片为正方形尺寸

    在深度学习中,模型的输入size通常是正方形尺寸的,比如300 x 300这样.直接resize的话,会把图像拉的变形.通常我们希望resize以后仍然保持图片的宽高比. 例如: 如果直接resize ...