通过代码简单了解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创建和使用字典实例详解
Nov 01 Python
Python格式化css文件的方法
Mar 10 Python
详解python调度框架APScheduler使用
Mar 28 Python
Python中类的初始化特殊方法
Dec 01 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
python 产生token及token验证的方法
Dec 26 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
Python实现微信机器人的方法
Sep 06 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
Python selenium爬取微信公众号文章代码详解
Aug 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 面试碰到过的问题 在此做下记录
2011/06/09 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
js实现随机抽奖
2020/03/19 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
python目录与文件名操作例子
2016/08/28 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
网上卖盒饭创业计划书
2014/01/26 职场文书
毕业晚会主持词
2014/03/24 职场文书
高二学生评语大全
2014/04/25 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
团员年度个人总结
2015/02/26 职场文书
年度考核表个人总结
2015/03/06 职场文书
留学推荐信英文范文
2015/03/26 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript