通过代码简单了解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元组操作实例解析
Sep 23 Python
Python多进程并发(multiprocessing)用法实例详解
Jun 02 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
python win32 简单操作方法
May 25 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
Django中的cookie和session
Aug 27 Python
关于numpy数组轴的使用详解
Dec 05 Python
通过实例学习Python Excel操作
Jan 06 Python
pytorch自定义二值化网络层方式
Jan 07 Python
如何在Windows中安装多个python解释器
Jun 16 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 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
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
js的表单操作 简单计算器
2011/12/29 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
python sys模块sys.path使用方法示例
2013/12/04 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Django组件cookie与session的具体使用
2019/06/05 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
金鑫耀Java笔试题
2014/09/06 面试题
思想品德课教学反思
2014/02/10 职场文书
中学教师教育感言
2014/02/21 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
仓库管理员岗位职责
2015/02/03 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
教师学习心得体会范文
2016/01/21 职场文书
关于做家务的心得体会
2016/01/23 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python