1. 程式人生 > 程式設計 >通過程式碼簡單瞭解django model序列化作用

通過程式碼簡單瞭解django model序列化作用

一直對使用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,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,null=True,verbose_name='HTTP狀態',choices=HTTP_CODE_CHOICE)
  responseData = models.TextField(blank=True,verbose_name='返回內容')
  # 新增用例相關引數
  preFun = models.CharField(max_length=1024,verbose_name='前置函式')
  afterFun = models.CharField(max_length=1024,verbose_name='後置函式')
  skipFlag = models.CharField(max_length=50,verbose_name='跳過標識',choices=Y_N_CHOICE)
  stopFlag = models.CharField(max_length=50,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類 型別)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。