Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】

相关文章:

Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客

本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看:

python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测试的喵酱的博客-CSDN博客 

一、项目环境的应用场景

1.1 环境说明:

1、项目运行时,可以选择一套环境来运行

2、环境里,主要就是这个项目的host

1.2 环境的接口及应用场景

 

接口列表

请求方式 URI 对应action 实现功能
GET /envs/ .list() 查询env列表
POST /envs/ .create() 创建一条数据
GET /envs/{id}/ .retrieve() 检索一条env的详细数据
PUT /envs/{id}/ update() 更新一条数据中的全部字段
PATCH /envs/{id}/ .partial_update() 更新一条数据中的部分字段
DELETE /envs/{id}/ .destroy() 删除一条数据
GET /envs/names/ .names() 自定义 查询env列表

1、查询env列表 .list()

GET /envs/ .list() 查询env列表

Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】_第1张图片

注意:

1、列表涉及到分页 

2、创建一条env .create()

Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】_第2张图片

 3、查看详情与编辑 .retrieve()  update() .partial_update()

  • 查看 .retrieve() 
  • 更新 update()  partial_update()

Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】_第3张图片

 4、env列表 names

Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】_第4张图片

 已经有list,为什么还要自定义action names:

  • list 有分页,names没有分页
  • list展示的项目数据,names只展示id 与 name

二、数据模型 model

models.py 

from django.db import models

from utils.base_models import BaseModel


class Envs(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField(verbose_name='环境名称', max_length=200, unique=True, help_text='环境名称')
    base_url = models.URLField(verbose_name='请求base url', max_length=200, help_text='请求base url')
    desc = models.CharField(verbose_name='简要描述', max_length=200, help_text='简要描述')

    class Meta:
        db_table = 'tb_envs'
        verbose_name = '环境信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

 环境模块,目前只有一个字段,就是

base_url = models.URLField(verbose_name='请求base url', max_length=200, help_text='请求base url')

整个项目的host地址

三、序列化器 serializers

serializers.py

from rest_framework import serializers

from .models import Envs


class EnvsModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Envs
        exclude = ('update_datetime',)
        extra_kwargs = {
            'create_datetime': {
                'read_only': True,
                'format': '%Y年%m月%d日 %H:%M:%S'
            }
        }


class EnvsNamesSerializer(serializers.ModelSerializer):

    class Meta:
        model = Envs
        fields = ('id', 'name')

有两个序列化器。

  • EnvsModelSerializer:正常显示所有数据
  • EnvsNamesSerializer:只显示id与name,为names action 准备的

四、视图

4.1 viewsets.ModelViewSet

views.py 视图

from rest_framework import viewsets
from rest_framework import permissions
from .models import Envs
from . import serializers
from utils.mixins import NamesMixin


class EnvsViewSet(NamesMixin, viewsets.ModelViewSet):
    queryset = Envs.objects.all()
    serializer_class = serializers.EnvsModelSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_serializer_class(self):
        if self.action == "names":
            return serializers.EnvsNamesSerializer
        else:
            return self.serializer_class

通过继承 viewsets.ModelViewSet视图类,实现以下接口

请求方式 URI 对应action 实现功能
GET /envs/ .list() 查询env列表
POST /envs/ .create() 创建一条数据
GET /envs/{id}/ .retrieve() 检索一条env的详细数据
PUT /envs/{id}/ update() 更新一条数据中的全部字段
PATCH /envs/{id}/ .partial_update() 更新一条数据中的部分字段
DELETE /envs/{id}/ .destroy() 删除一条数据

4.2  自定义names

相关知识点:

深入理解DRF中的Mixin类_做测试的喵酱的博客-CSDN博客

python中Mixin类的使用_做测试的喵酱的博客-CSDN博客 

names接口,需要我们自定义action 

GET /envs/names/ .names() 自定义 查询env列表

1、自定义  NamesMixin:

class NamesMixin:
    @action(methods=['GET'], detail=False)
    def names(self, request, *args, **kwargs):
        response = super().list(request, *args, **kwargs)
        return response

    def paginate_queryset(self, queryset):
        """
        names action禁用分页功能
        :param queryset:
        :return:
        """
        if self.action == "names":
            return
        else:
            return super().paginate_queryset(queryset)

    def filter_queryset(self, queryset):
        """
        names action禁用过滤功能
        :param queryset:
        :return:
        """
        if self.action == "names":
            return self.queryset
        else:
            return super().filter_queryset(queryset)

 2、自定义names action

    @action(methods=['GET'], detail=False)
    def names(self, request, *args, **kwargs):
        response = super().list(request, *args, **kwargs)
        return response

3、分页处理

    def filter_queryset(self, queryset):
        """
        names action禁用过滤功能
        :param queryset:
        :return:
        """
        if self.action == "names":
            return self.queryset
        else:
            return super().filter_queryset(queryset)

4、过滤处理

    def filter_queryset(self, queryset):
        """
        names action禁用过滤功能
        :param queryset:
        :return:
        """
        if self.action == "names":
            return self.queryset
        else:
            return super().filter_queryset(queryset)

源码:

Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】_第5张图片

 

当action 为names时,不做分页、过滤功能的处理。

这里的 def paginate_queryset(self, queryset): 

def filter_queryset(self, queryset): 方法,是重写。

重写的

 EnvsViewSet(NamesMixin, viewsets.ModelViewSet-> ModelViewSet->GenericViewSet->GenericAPIView 类下的方法。

GenericAPIView源码:

Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】_第6张图片

 

你可能感兴趣的:(Django实现测试平台,Django/flask,django,自动化,python)