一直对使用DRF的了解停留在一知半解的状态,今天在实际操作中,感受到了DRF带来的方便
Django工程,其中两个model定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | AutomationHeadRaw: class AutomationHeadRaw(models.Model): """ 测试用例的请求的json形式参数 """ id = models.AutoField(primary_key = True ) automationCaseApi = models.OneToOneField(AutomationCaseApi, related_name = 'headRaw' , on_delete = models.CASCADE, verbose_name = '接口' ) data = models.TextField(verbose_name = '源数据请求头json数据' , blank = True , null = True ) class Meta: verbose_name = '请求头json格式参数' verbose_name_plural = '请求头json格式参数管理' |
AutomationCaseApi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class AutomationCaseApi(models.Model): """ 用例执行接口 """ id = models.AutoField(primary_key = True ) automationTestCase = models.ForeignKey(AutomationTestCase, on_delete = models.CASCADE, verbose_name = '用例' , related_name = "api" ) name = models.CharField(max_length = 50 , verbose_name = '接口名称' ) httpType = models.CharField(max_length = 50 , default = 'HTTP' , verbose_name = 'HTTP/HTTPS' , choices = HTTP_CHOICE) requestType = models.CharField(max_length = 50 , verbose_name = '请求方式' , choices = REQUEST_TYPE_CHOICE) apiAddress = models.CharField(max_length = 1024 , verbose_name = '接口地址' ) requestParameterType = models.CharField(max_length = 50 , verbose_name = '参数请求格式' , choices = REQUEST_PARAMETER_TYPE_CHOICE) headType = models.CharField(max_length = 50 , verbose_name = '请求头部格式' , choices = REQUEST_PARAMETER_TYPE_CHOICE) formatRaw = models.BooleanField(default = False , verbose_name = "是否转换成源数据" ) examineType = models.CharField(default = 'no_check' , max_length = 50 , verbose_name = '校验方式' , choices = EXAMINE_TYPE_CHOICE) httpCode = models.CharField(max_length = 50 , blank = True , null = True , verbose_name = 'HTTP状态' , choices = HTTP_CODE_CHOICE) responseData = models.TextField(blank = True , null = True , verbose_name = '返回内容' ) # 新增用例相关参数 preFun = models.CharField(max_length = 1024 , blank = True , null = True , verbose_name = '前置函数' ) afterFun = models.CharField(max_length = 1024 , blank = True , null = True , verbose_name = '后置函数' ) skipFlag = models.CharField(max_length = 50 , blank = True , null = True , verbose_name = '跳过标识' , choices = Y_N_CHOICE) stopFlag = models.CharField(max_length = 50 , blank = True , null = True , verbose_name = '中断标识' , choices = Y_N_CHOICE) retryNum = models.IntegerField(verbose_name = '重试次数' , default = 1 ) def __unicode__( self ): return self .name def __str__( self ): return self .name class Meta: verbose_name = '用例接口' verbose_name_plural = '用例接口管理' |
1、手工转换获取到了AutomationHeadRaw模型中的data数据(json格式)
需求为取AutomationHeadRaw模型中的data数据(json格式),我在使用的时候,没有给AutomationHeadRaw建立对应的序列化类,取数时使用一下数据获取data数据:
head_test = AutomationHeadRaw.objects.filter(automationCaseApi=self.case_api_id)
self.header =json.loads(json.loads(serializers.serialize('json', head))[0]["fields"]["data"])
手工转换获取到了AutomationHeadRaw模型中的data数据(json格式)
2、自动转换获取到了AutomationCaseApi模型中的data数据
另一个模型AutomationCaseApi ,定义了对应的model序列化类AutomationCaseApiSerializer如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class AutomationCaseApiSerializer(serializers.ModelSerializer): """ 自动化用例接口详细信息序列化 """ headers = AutomationHeadSerializer(many = True , read_only = True ) headRaw = AutomationHeadRawSerializer(many = False , read_only = True ) # 一对一表格,变量名一定要和model定义relate-name一直 parameterList = AutomationParameterSerializer(many = True , read_only = True ) parameterRaw = AutomationParameterRawSerializer(many = False , read_only = True ) class Meta: model = AutomationCaseApi fields = ( 'id' , 'name' , 'httpType' , 'requestType' , 'apiAddress' , 'headers' , 'headType' , 'requestParameterType' , 'headRaw' , 'formatRaw' , 'parameterList' , 'parameterRaw' , 'examineType' , 'httpCode' , 'responseData' , 'preFun' , 'afterFun' , 'skipFlag' , 'stopFlag' , 'retryNum' ) |
则获取模型AutomationCaseApi可以自动转换:
self.case_data = AutomationCaseApiSerializer(
AutomationCaseApi.objects.get(id=self.case_api_id, automationTestCase=self.case_id)).data
3、因此上面的AutomationHeadRaw 可以通过添加model序列化类AutomationHeadRawSerializer自动转换数据格式:
class AutomationHeadRawSerializer(serializers.ModelSerializer):
自动化用例接口json类型请求头信息序列化
class Meta:
model = AutomationHeadRaw
fields = ('id', 'automationCaseApi', 'data')获取数据语句可以改成,不需要手工转换:
head = AutomationHeadRawSerializer(
AutomationHeadRaw.objects.filter(automationCaseApi=self.case_api_id),
many=True).data
注意:
上面获取数据的AutomationHeadRawSerializer()方法,入参1 :AutomationHeadRaw.objects.filter(automationCaseApi=self.case_api_id)
可以为两种对象:
AutomationHeadRaw.objects.filter(automationCaseApi=self.case_api_id) (filter方法对象为queryset类型)
AutomationCaseApi.objects.get(id=self.case_api_id, automationTestCase=self.case_id)(get方法对象为model类 类型)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/199573/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)