【效能平台】配置管理模块——获取配置列表数据、查看配置详情数据、增加以及更新配置、删除配置相关功能开发(九)

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 【效能平台】配置管理模块——获取配置列表数据、查看配置详情数据、增加以及更新配置、删除配置相关功能开发(九),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、页面展示

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/123255.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!