DRF Django REST framework 之 视图组件(四)
引言
在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方。这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑。
视图组件
使用视图组件的mixin优化接口逻辑
- 导入 mixins
- 定义序列化类
- 定义视图类
# 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优化接口逻辑
- 导入 generics
- 导入序列化类
- 定义视图类
对 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优化接口逻辑
看似已经优化的非常完美了,但是在一个对性能要求极高的项目里面,我们的程序还可以继续优化,不断的优化程序是每个程序员必备的技能。
- 定义 url
- 导入 viewset
- 导入序列化类
- 定义视图类
注意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 之 视图组件(四)的更多相关文章
- DRF Django REST framework 之 认证组件(五)
引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...
- 轻轻松松学会 DRF Django REST framework
据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...
- Django Rest framework 之 视图
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- DRF Django REST framework APIView(一)
什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...
- django rest framework 解析器组件 接口设计,视图组件 (1)
一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.d ...
- django rest framework 解析器组件 接口设计,视图组件 (2)
1. 使用视图组件进行接口优化 1.1 使用视图组件的mixin进行接口逻辑优化 - 导入mixin from rest_framework.mixinx import ( ListModelMix, ...
- Django Rest Framework源码剖析(四)-----API版本
一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...
- DRF Django REST framework 之 解析器(二)
引入 Django Rest framework帮助我们实现了处理application/json协议请求的数据,如果不使用DRF,直接从 request.body 里面拿到原始的客户端请求的字节数据 ...
- DRF (Django REST framework) 中的Request 与 Response
DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...
随机推荐
- 『题解』洛谷P3384 【模板】树链剖分
Problem Portal Portal1: Luogu Description 如题,已知一棵包含\(N\)个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作\(1\): ...
- Springboot中的缓存Cache和CacheManager原理介绍
背景理解 什么是缓存,为什么要用缓存 程序运行中,在内存保持一定时间不变的数据就是缓存.简单到写一个Map,里面放着一些key,value数据,就已经是个缓存了 所以缓存并不是什么高大上的技术,只是个 ...
- W与V模型的联系与区别
很多小白一定要注意: 看准那个是开发的工作哪个是测试的工作,不要弄混了!!! 软件测试的V模型 以“编码”为黄金分割线,将整个过程分为开发和测试,并且开发和测试之间是串行的关系 ...
- OFFICE 2010 每次打开提示安装的问题
OFFICE2010 安装后每次打开 文件总是提示配置 解决办法: 前提是office已经激活 注册表找到 HKEY_CURRENT_USER\Software\Microsoft\Office\14 ...
- Django 基本使用
Django 基本使用 Django 安装 pip install django Django 创建项目 django-admin startproject 项目名称 Django 创建应用 pyth ...
- setState何时同步,何时异步,为什么?
setState何时同步,何时异步,为什么 答案:在React库控制时,异步:否则同步. 示例代码如下: constructor(props){ super(porps); this.state = ...
- 正则表达式 第五篇:C# 正则元字符
本文整理C#正则表达式的元字符,正则表达式是由字符构成的表达式,每个字符代表一个规则,表达式中的字符分为两种类型:普通字符和元字符.普通字符是指字面含义不变的字符,按照完全匹配的方式匹配文本,而元字符 ...
- Opencv的线性滤波和非线性滤波
线性滤波 :方框滤波 均值滤波 高斯滤波 非线性滤波: 中值滤波 双边滤波 这几个滤波都是起模糊作用 去除噪点 不废话了 下面是代码 #include <opencv2/opencv.h ...
- Bran的内核开发教程(bkerndev)-08 中断服务程序(ISR)
中断服务程序(ISR) 中断服务程序(ISR)用于保存当前处理器的状态, 并在调用内核的C级中断处理程序之前正确设置内核模式所需的段寄存器.而工作只需要15到20行汇编代码来处理, 包括调用C中的 ...
- Orleans 3.0 为我们带来了什么
原文:https://devblogs.microsoft.com/dotnet/orleans-3-0/ 作者:Reuben Bond,Orleans首席软件开发工程师 翻译:艾心 这是一篇来自Or ...