通过代码简单了解django model序列化作用


Posted in Python onNovember 12, 2020

一直对使用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类 类型)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用urllib2防止302跳转的代码例子
Jul 07 Python
Python出现segfault错误解决方法
Apr 16 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
Python多线程获取返回值代码实例
Feb 17 Python
python模拟点击网页按钮实现方法
Feb 25 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 Python
Django contrib auth authenticate函数源码解析
Nov 12 #Python
python 获取字典键值对的实现
Nov 12 #Python
Sentry错误日志监控使用方法解析
Nov 12 #Python
python 利用opencv实现图像网络传输
Nov 12 #Python
Anaconda详细安装步骤图文教程
Nov 12 #Python
Jupyter Notebook安装及使用方法解析
Nov 12 #Python
利用Python发送邮件或发带附件的邮件
Nov 12 #Python
You might like
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP中MD5函数使用实例代码
2008/06/07 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
python 编写简单网页服务器的实例
2018/06/01 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
python3实现点餐系统
2019/01/24 Python
python对Excel的读取的示例代码
2020/02/14 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
香港通票:Hong Kong Pass
2019/02/26 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
恐龙的灭绝教学反思
2014/02/12 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
商场租赁意向书
2014/07/30 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
朋友聚会开场白
2015/06/01 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
win10更新失败无限重启解决方法
2022/04/19 数码科技