一、页面展示
1、配置列表页面展示
2、新增配置页面展示
二、定义模型类
from django.db import models
# Create your models here.
from django.db import models
from utils.base_models import BaseModel
class Configures(BaseModel):
name = models.CharField('配置名称', max_length=50, help_text='配置名称')
interface = models.ForeignKey('interfaces.Interfaces',
on_delete=models.CASCADE,
related_name='configures',
help_text='所属接口')
author = models.CharField('编写人员', max_length=50, help_text='编写人员')
request = models.TextField('请求信息', help_text='请求信息')
class Meta:
db_table = 'tb_configures'
verbose_name = '配置信息'
verbose_name_plural = verbose_name
ordering = ('id',)
def __str__(self):
return self.name
三、定义序列化器类
根据列表页面知需要输出配置id、配置名称、所属项目、所属接口、编写人员
根据增加用例页面需要输入项目id、接口id、请求信息、编写人员、配置名称
1、项目表和用例表没有直接的关系,无法直接关联,需要用接口表去关联
2、当一个序列化器类中需要另一个序列化器中的某些字段,需要自定义序列化器类作为另外一个序列化器中的字段来使用
3、注意pid和iid,输出的是项目名称和接口名称,输入的是项目id和接口id
4、需要校验pid和iid(a、通过iid校验接口表中有没有这条数据,通过pid校验项目表中有没有这条数据;b、需要校验接口表中id=iid和project_id=pid是否存在)
5、to_internal_value方法是所有字段校验通过后最先执行的方法
from rest_framework import serializers
from configures.models import Configures
from interfaces.models import Interfaces
from projects.models import Projects
def test_pid(value):
count=Projects.objects.filter(id=value).count()
if not count:
raise serializers.ValidationError('pid不存在')
return value
def test_iid(value):
count=Interfaces.objects.filter(id=value).count()
if not count:
raise serializers.ValidationError('iid不存在')
return value
class InterfacesProjectsModelSerializer(serializers.ModelSerializer):
project=serializers.StringRelatedField(label='接口所属项目名称',help_text='接口所属项目名称',read_only=True)
pid=serializers.IntegerField(label='接口所属项目id',
help_text='接口所属项目id',
write_only=True,
validators=[test_pid])
iid=serializers.IntegerField(label='接口id',
help_text='接口id',
write_only=True,
validators=[test_iid])
class Meta:
model=Interfaces
fields=['name','project','pid','iid']
extra_kwargs={
'name':{
'read_only':True
}
}
def validate(self, attrs):
iid=attrs.get('iid')
pid=attrs.get('pid')
count=Interfaces.objects.filter(id=iid,project_id=pid).exists()
if not count:
raise serializers.ValidationError('pid和iid不匹配')
return attrs
class ConfiguresModelSerializer(serializers.ModelSerializer):
interface=InterfacesProjectsModelSerializer(label='接口信息',help_text='接口信息')
class Meta:
model=Configures
exclude=['create_time','update_time']
extra_kwargs={
'request':{
'write_only':True
}
}
def to_internal_value(self, data):
response=super().to_internal_value(data)
iid=response['interface']['iid']
response['interface_id']=iid
response.pop('interface')
return response
四、定义视图
class ConfiguresViewSet(ModelViewSet):
queryset=Configures.objects.all(is_delete=False)
serializer_class=ConfiguresModelSerializer
pagination_class=PageNumberPagination
permission_classes=[permission.IsAuthenticated]
ordering_fields=['id','name']
def retrieve(self,request,*args,**kwargs):
config_obj=self.get_object()
config_request=json.loads(config_obj.request,encoding='utf-8')
#处理请求头数据
config_headers=config_request['config']['request'].get('headers')
config_headers_list=handle_datas.handle_data4(config_headers)
# 处理全局变量数据
config_variables = config_request['config'].get('variables')
config_variables_list = handle_datas.handle_data2(config_variables)
config_name = config_request['config']['name']
selected_interface_id = config_obj.interface_id
selected_project_id = Interfaces.objects.get(id=selected_interface_id).project_id
data = {
"author": config_obj.author,
"configure_name": config_name,
"selected_interface_id": selected_interface_id,
"selected_project_id": selected_project_id,
"header": config_headers_list,
"globalVar": config_variables_list
}
return Response(data)
def perform_desroy(self,instance):
instance.is_delete=True #软删除,没有真正的删除
instance.save()
五、定义路由
from django.urls import path, include
from rest_framework import routers
from configures.views import ConfiguresViewSet
router=routers.SimpleRouter()
router.register(r'configures',ConfiguresViewSet)
urlpatterns=[
path('',include(router.urls))
]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74029.html