通过代码简单了解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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python简单实现enum功能的方法
Apr 25 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
python实现猜单词小游戏
May 22 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
python列表返回重复数据的下标
Feb 10 Python
Python如何执行系统命令
Sep 23 Python
Django用户认证系统如何实现自定义
Nov 12 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
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
js实现登录与注册界面
2017/11/01 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
详解Python中find()方法的使用
2015/05/18 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
Python 的类、继承和多态详解
2017/07/16 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
使用Python进行目录的对比方法
2018/11/01 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android