通過程式碼簡單瞭解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類 型別)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。