相關(guān)文章:
Django實現(xiàn)接口自動化平臺(八)測試報告reports序列化器及視圖【持續(xù)更新中】_做測試的喵醬的博客-CSDN博客
本章是項目的一個分解,查看本章內(nèi)容時,要結(jié)合整體項目代碼來看:
python django vue httprunner 實現(xiàn)接口自動化平臺(最終版)_python+vue自動化測試平臺_做測試的喵醬的博客-CSDN博客
一、項目環(huán)境的應用場景
1.1 環(huán)境說明:
1、項目運行時,可以選擇一套環(huán)境來運行
2、環(huán)境里,主要就是這個項目的host
1.2 環(huán)境的接口及應用場景
接口列表
請求方式 | URI | 對應action | 實現(xiàn)功能 |
GET | /envs/ | .list() | 查詢env列表 |
POST | /envs/ | .create() | 創(chuàng)建一條數(shù)據(jù) |
GET | /envs/{id}/ | .retrieve() | 檢索一條env的詳細數(shù)據(jù) |
PUT | /envs/{id}/ | update() | 更新一條數(shù)據(jù)中的全部字段 |
PATCH | /envs/{id}/ | .partial_update() | 更新一條數(shù)據(jù)中的部分字段 |
DELETE | /envs/{id}/ | .destroy() | 刪除一條數(shù)據(jù) |
GET | /envs/names/ | .names() 自定義 | 查詢env列表 |
1、查詢env列表?.list()
GET | /envs/ | .list() | 查詢env列表 |
注意:
1、列表涉及到分頁?
2、創(chuàng)建一條env?.create()
?3、查看詳情與編輯?.retrieve()??update()?.partial_update()
- 查看?.retrieve()?
- 更新?update()? partial_update()
?4、env列表 names
?已經(jīng)有l(wèi)ist,為什么還要自定義action names:
- list 有分頁,names沒有分頁
- list展示的項目數(shù)據(jù),names只展示id 與 name
二、數(shù)據(jù)模型 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='環(huán)境名稱', max_length=200, unique=True, help_text='環(huán)境名稱')
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 = '環(huán)境信息'
verbose_name_plural = verbose_name
ordering = ('id',)
def __str__(self):
return self.name
?環(huán)境模塊,目前只有一個字段,就是
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:正常顯示所有數(shù)據(jù)
- 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視圖類,實現(xiàn)以下接口
請求方式 | URI | 對應action | 實現(xiàn)功能 |
GET | /envs/ | .list() | 查詢env列表 |
POST | /envs/ | .create() | 創(chuàng)建一條數(shù)據(jù) |
GET | /envs/{id}/ | .retrieve() | 檢索一條env的詳細數(shù)據(jù) |
PUT | /envs/{id}/ | update() | 更新一條數(shù)據(jù)中的全部字段 |
PATCH | /envs/{id}/ | .partial_update() | 更新一條數(shù)據(jù)中的部分字段 |
DELETE | /envs/{id}/ | .destroy() | 刪除一條數(shù)據(jù) |
重寫了get_serializer_class 方法
?EnvsViewSet(NamesMixin, viewsets.ModelViewSet)->?ModelViewSet->GenericViewSet->GenericAPIView 類下的方法。
get_serializer_class 源碼:
?
重寫后,當action為names時,返回序列化器為serializers.EnvsNamesSerializer
?
4.2? 自定義names
相關(guān)知識點:
深入理解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)
源碼:
當action 為names時,不做分頁、過濾功能的處理。
這里的?def paginate_queryset(self, queryset):?
def filter_queryset(self, queryset): 方法,是重寫。
重寫的
?EnvsViewSet(NamesMixin, viewsets.ModelViewSet)->?ModelViewSet->GenericViewSet->GenericAPIView 類下的方法。
GenericAPIView源碼:文章來源:http://www.zghlxwxcb.cn/news/detail-585884.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-585884.html
到了這里,關(guān)于Django實現(xiàn)接口自動化平臺(九)環(huán)境envs序列化器及視圖【持續(xù)更新中】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!