Django REST Framework中Model序列化器的自动转换优势

Ada
Ada
发布时间:2026-10-15| 4人浏览过
原创

本文通过对比手动解析JSON字符串与使用Django REST Framework的ModelSerializer,展示了后者在自动化数据转换中的便捷性。文章详细说明了如何定义序列化类,并演示了该序列化器对QuerySet和单个Model对象两种入参类型的兼容处理方式,旨在帮助开发者更高效地处理API数据输出。

DRF序列化器的便捷性体验

以往对DRF(Django REST Framework)的理解仅停留在表面,直到在实际项目中应用,才切实体会到其带来的开发便利。

Django Model定义与手动转换局限

在Django项目中,定义了两个核心Model:

AutomationHeadRaw模型定义


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模型。

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 = '用例接口管理'

手动JSON解析的实现方式

第一种方式是手动转换,从AutomationHeadRaw模型中提取data字段(JSON格式数据)。

具体需求是从AutomationHeadRaw模型中获取data字段(JSON格式)。由于当时未为该模型创建对应的序列化类,获取数据时需进行手动转换,代码如下: 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格式)。

利用ModelSerializer自动转换

第二种方式是自动转换,直接从AutomationCaseApi模型中获取data数据。

对于另一个模型AutomationCaseApi,我们定义了相应的Model序列化类AutomationCaseApiSerializer,定义如下:

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

为AutomationHeadRaw添加序列化类

基于上述对比,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()方法时,第一个入参为:AutomationHeadRaw.objects.filter(automationCaseApi=self.case_api_id)。

该入参可以接受两种类型的对象:

1. AutomationHeadRaw.objects.filter(automationCaseApi=self.case_api_id),其中filter方法返回的是queryset类型对象; 2. AutomationCaseApi.objects.get(id=self.case_api_id, automationTestCase=self.case_id),其中get方法返回的是model类类型对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。