【效能平台】接口模块——获取列表数据、查看详情数据、增加以及更新项目接口、删除接口相关功能开发(六)

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

今日状态:充充实实
打卡学习 星期一 星期二 星期三 星期四 星期五 星期六 星期日
成功 暂无 暂无 暂无 暂无 暂无 暂无

一、获取接口列表数据

在这里插入图片描述

二、获取接口详情数据和更新数据

在这里插入图片描述

三、增加接口数据

在这里插入图片描述

🌙1、模型类:

from django.db import models
from utils.base_models import BaseModel


class Interfaces(BaseModel):
    name = models.CharField('接口名称', max_length=200, unique=True, help_text='接口名称')
    project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
                                related_name='interfaces', help_text='所属项目')
    tester = models.CharField('测试人员', max_length=50, help_text='测试人员')
    desc = models.CharField('简要描述', max_length=200, null=True, blank=True, help_text='简要描述')

    class Meta:
        db_table = 'tb_interfaces'
        verbose_name = '接口信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

根据需求得后端需要返回的字段是id、name、tester、project、create_time、desc

🌟tip1:project:返回的数据是项目id,现在要获取的是项目名称

1、重写project字段,调用StringRelatedField方法

🌟tip2:注意:内部类中fields、exclude的使用

1、fields='__all__':表示将模型类中所有的字段进行序列化和反序列化操作
2、exclude=['update_time']:表示除了模型类中update_time字段,其他字段都要进行序列化和反序列化操作
3、fields=['id','name','tester','project','create_time','desc']:表示只对模型类中的’id’,‘name’,‘tester’,‘project’,‘create_time’,’desc’字段进行序列化和反序列化操作
4、特别注意的是:在序列化器类中自定义了字段,如果使用上面的编号为3的编写方式:需要将自定义的字段写到列表中,不然无效

🌟tip3:继承模型序列化器类和继承序列化器类的区别

1、如果是对模型类中的字段进行序列化和反序列化操作,继承模型序列化器类(ModelSerializer)
2、如果对自定义的一些字段进行序列化和反序列化操作,继承序列化器类(Serializer)
3、但凡是对模型类中的一个字段进行操作时,继承模型序列化器类(ModelSerializer)
4、如果没有对模型类中的任何字段进行操作,继承序列化器类(Serializer)

🌟tip4:需求:列表输出的时候是项目名称,但是新增接口信息的时候输入的是项目id

1、project_id=serializer.PrimaryKeyRelatedField(label=‘接口所属项目id’,help_text=‘接口所属项目id’,queryset=Projects.objects.all(),write_only=True)

🌟tip5:定义字段project_id时,当调用PrimaryKeyRelatedField字段进行序列化输入时,会自动转化为模型对象

1、校验通过后,重写to_internal_value方法,需要将project_id变为项目id
2、to_internal_value方法,是所有字段开始进行校验时的入口方法(最先调用的方法)

def to_internal_value(self,data):
	result=super().to_intrenal_value(data)
	result['project_id']=result.get('project_id').id
	return result

🌙定义序列化器类

class InterfacesSerializer(serializers.ModelSerializer):
	project=serializer.StringRelatedField(label='接口所属项目',help_text='接口所属项目',read_only=True)
	project_id=serializer.PrimaryKeyRelatedField(label='接口所属项目id',help_text='接口所属项目id',queryset=Projects.objects.all(),write_only=True)
	
	class Meta:
		model=Interfaces
		fields=['id','name','tester','project','create_time','desc','project_id']
		#exclude=['update_time']
		extra_kwargs={
			"create_time":{
				"read_only":True,
				"format":"%Y年%m月%d日 %H:%M:%S",
				}
		}
	

	def to_internal_value(self,data):
		result=super().to_intrenal_value(data)
		result['project_id']=result.get('project_id').id
		return result
	
#todo 获取某一条接口下的所有用例数据的序列化设计
class TestcasesNamesModelSerializer(serializers.ModelSerializer):
	class Meta:
		model=Testcases
		fields=['id','name']

class InterfacesTestcasesSerializer(serializer.ModelSerializer):
	interface=TestcasesNamesModelSerializer(label='接口下所属用例',help_text='接口下所属用例',read_only=True,many=True)
	class Meta:
		model=Interfaces
		fields=['testcase']

🌟tip6:如果想要通过父表(接口表)获取从表(用例表)得所有字段(id、name),怎么做?

1、自定义的序列化器类实际上也Field子类
2、所以自定义的序列化器类可以作为另外一个序列化器中的字段来使用

🌙定义视图类:

class InterfacesViewSet(ModelViewSet):
	queryset=Interfaces.objects.all()
	serializer_class=InterfacesSerializer
	pagination_class = PageNumberPagination

	def list(self,request,*aegs,**kwargs):
		response=super().list(request,*aegs,**kwargs)
		for item in response.data.get('results'):
			item['testcases']=Testcases.objects.filter(interface_id=item.get('id')).count()
			item['configures']=Configures.objects.filter(interface_id=item.get('id')).count()
		return response
	
	
	#todo 获取某一条接口下的所有用例数据
	@action(methods=['GET'],detail=True)
	def interfaces(self,request,*args,**kwargs):
		response=super().retrieve(request,*args,**kwargs)
		response.data=response.data.get('interface')
		return response
	
	def get_serializer_class(self):
		if self.action=='interfaces':
			return InterfacesTestcasesSerializer
		else:
			return super().get_serializer_class()

🌙定义路由:

router=routers.SimpleRouter()
router.register(r'interfaces',InterfacesViewSet)

urlpatterns=[
	path('',include(router.urls))
]

🌟tip7:获取接口下的所有用例的总数

1、由于接口和用例是一对多的关系,先获取接口的模型对象item
2、Testcases.objects.fiter(interface_id=item.get(‘id’)).count(),interface_id用例数据表中的关联接口字段

🌙测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74040.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!