通过代码简单了解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中degrees()方法的使用
May 18 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
Python 操作SQLite数据库的示例
Oct 16 Python
10张动图学会python循环与递归问题
Feb 06 Python
python字符串拼接.join()和拆分.split()详解
Nov 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
小偷PHP+Html+缓存
2006/12/20 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
python中正则表达式的使用方法
2018/02/25 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
深入分析python 排序
2020/08/24 Python
Python random模块的使用示例
2020/10/10 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
2013年学期结束动员演讲稿
2014/01/07 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
诚信承诺书范文
2014/03/27 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python