欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过代码简单了解django model序列化作用

程序员文章站 2022-03-02 16:34:19
一直对使用drf的了解停留在一知半解的状态,今天在实际操作中,感受到了drf带来的方便django工程,其中两个model定义如下:automationheadraw:class automation...

一直对使用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类 类型)

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