通过代码简单了解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的Flask框架中的signals信号机制
Jun 13 Python
python查询mysql,返回json的实例
Mar 26 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
简单了解python变量的作用域
Jul 30 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
解决python3 安装不了PIL的问题
Aug 16 Python
python3 map函数和filter函数详解
Aug 26 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
Python生成器常见问题及解决方案
Mar 21 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输出表格的实现代码(修正版)
2010/12/29 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
Python中的choice()方法使用详解
2015/05/15 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
浅谈Python处理PDF的方法
2017/11/10 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
Python数据可视化之画图
2019/01/15 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
pandas的相关系数与协方差实例
2019/12/27 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
英文简历中的自我评价用语
2013/12/09 职场文书
大学生自我鉴定范文
2013/12/28 职场文书
工程采购员岗位职责
2014/03/09 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
投资合作意向书范本
2015/05/08 职场文书
Golang 结构体数据集合
2022/04/22 Golang
Redis keys命令的具体使用
2022/06/05 Redis