DRF Django REST framework 之 视图组件(四)

引言

在我们有几十上百的视图类,都有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

~>.<~

原文地址:https://www.cnblogs.com/pungchur/p/12028325.html

时间: 2024-10-06 18:25:23

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

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

引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任何数据,有客户端请求,我即返回数据,简单方便,每一个http请求都是新的,响应之后立即断开连接. 而如今,互联网的世界发生了翻天覆地的变化,用户不仅仅需要跟其他用户沟通交流,还需要跟服务器交互,不管是论坛类.商城类.社交类.门户类还是其他各类Web站点,大家都非常重视用户交互,只有跟用户交互了,才能

轻轻松松学会 DRF Django REST framework

DRF Django REST framework 之 APIView(一) DRF Django REST framework 之 解析器(二) DRF Django REST framework 之 序列化(三) DRF Django REST framework 之 视图组件(四) 持续更新中.... 原文地址:https://www.cnblogs.com/pungchur/p/12028316.html

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

一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.data触发 二.序列化组件 2.1.django 自带组件serializer 2.1.1 from django.serializers import serialize2.1.2 origin_data = Book.objects.all()2.1.3 serialized_data = se

DRF (Django REST framework) 框架介绍

Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离 前后端分离 1 前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高. 这种应用模式比较适合纯网页应用,但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而仅仅是数据本身,所以后端原本返回网页的接口不再适用于前端App应用,为了对接App后端还需再开发一套接口. 2 前后端分离 在前后端分离的应用模式中,后端仅返

DRF (Django REST framework) 框架介绍(2)

环境安装与配置 DRF需要以下依赖: Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6) Django (1.10, 1.11, 2.0) DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建.(若没有Django环境,需要先创建环境安装Django) 1. 安装DRF pip install djangorestframework 2. 添加rest_framework应用 我们利用在Django框架学习中创建的demo工

Django rest framework (视图类详解)

官网:https://www.django-rest-framework.org/api-guide/viewsets/ 在django rest framework 视图中一共有N个类 第一类:APIview class IndexView(APIView): def get(self,request,*args,**kwargs): pk = kwargs.get('pk') if pk: queryset = models.UserInfo.objects.get(pk=pk) ser =

django rest framework的十个组件

Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API .Django REST Framework可以在Django的基础上迅速实现API,并且自身还带有WEB的测试页面,可以方便的测试自己的API.简单说一下这个工具包的十个功能: 1.权限 2.认证 3.访问频率 4.序列化 (使用最多) 5.路由 6.视图 7.分页器 8.解析器 9.渲染器 10.版本 原文地址:https://www.cnblogs.com/zivli/p/10321771.htm

DRF Django REST framework 之 频率,响应器与分页器组件(六)

频率组件 频率组件类似于权限组件,它判断是否给予请求通过.频率指示临时状态,并用于控制客户端可以向API发出的请求的速率. 与权限一样,可以使用多个调节器.API可能会对未经身份验证的请求进行限制,而对于经过身份验证的请求则进行限制较少. 例如,可以将用户限制为每分钟最多60个请求,每天最多1000个请求. 自定义频率组件 使用方式与权限,认证组件几乎相同 该方式没有DRF提供的方式简洁 import time import math from rest_framework import exc

DRF(Django Rest Framework)序列化组件接口使用和接口设计--!GET接口设计!

定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则.实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回Json数据) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.me