通过代码简单了解django model序列化作用
一直对使用drf的了解停留在一知半解的状态,今天在实际操作中,感受到了drf带来的方便
django工程,其中两个model定义如下:
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:
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如下:
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类 类型)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 详解Unique SQL原理和应用