ModelSerializer 使用知識點_serializers.SerializerMethodField()使用場景總結


serializers.SerializerMethodField和鈎子方法結合,可以實現對ModelSerializer類的一些字段進行二次加工,返回,如下:
1、對以ModelSerializer的類為外鍵數據進行處理
model如下:
A、Project
class Project(models.Model):
"""
項目表
"""
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, verbose_name='項目名稱')
version = models.CharField(max_length=50, verbose_name='版本')
description = models.CharField(max_length=1024, blank=True, null=True, verbose_name='描述')
status = models.BooleanField(default=True, verbose_name='狀態')
LastUpdateTime = models.DateTimeField(auto_now=True, verbose_name='最近修改時間')
createTime = models.DateTimeField(auto_now_add=True, verbose_name='創建時間')
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, max_length=1024, verbose_name='創建人')

def __unicode__(self):
return self.name

def __str__(self):
return self.name

class Meta:
verbose_name = '項目'
verbose_name_plural = '項目'

B、ApiInfo (以project為外鍵)
 
        
class ApiInfo(models.Model):
"""
接口信息
"""
id = models.AutoField(primary_key=True)
project = models.ForeignKey(Project, related_name='api_project', on_delete=models.CASCADE, verbose_name='所屬項目')

def __unicode__(self):
return self.name

def __str__(self):
return self.name

class Meta:
verbose_name = '接口'
verbose_name_plural = '接口管理'
 
2、project的ModelSerializer如下:

class ProjectSerializer(serializers.ModelSerializer):
"""
項目信息序列化
"""
apiCount = serializers.SerializerMethodField()
LastUpdateTime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
createTime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
user = serializers.CharField(source='user.first_name')

class Meta:
model = Project
fields = ('id', 'name', 'version', 'type', 'status', 'LastUpdateTime', 'createTime', 'apiCount',
'dynamicCount', 'memberCount', 'description', 'user')

def get_apiCount(self, obj):
return obj.api_project.all().count()


通過 obj.以它為外鍵的類字段的related_name 取出以它為外鍵的對象,該對象可以進行進行一般的model類操作(如obj.api_project.all().count()、obj.api_project.get(XXX查詢條件).XXX屬性),從而處理以它為外鍵的數據
 
2、對ModelSerializer的類里的choice等復雜字段的處理
model如下,有choice復雜字段status
class ApiInfo(models.Model):
"""
接口信息
"""
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, verbose_name='接口名稱')
status = models.CharField(max_length=50, verbose_name='狀態', choices=API_STATUS_CHOICES)


ModelSerializer如下:

class ApiDownLoanListSerializer(serializers.ModelSerializer):
"""
下載接口列表信息序列化
"""
status = serializers.SerializerMethodField()
def get_status(self, obj):
return obj.get_status_display()

class Meta:
model = ApiInfo
fields = ('id', 'name','status')
 
        
通過serializers.SerializerMethodField 和鈎子方法結合get_status_display()得到choice類數據

 

 
        
3、對ModelSerializer的類里的onetone類型數據取值
 
        
model如下,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='接口名稱')

def __unicode__(self):
return self.name

def __str__(self):
return self.name

class Meta:
verbose_name = '用例接口'
verbose_name_plural = '用例接口管理'
 
        
AutomationHeadRaw,和AutomationCaseApi一對一
class AutomationHeadRaw(models.Model):
"""
測試用例的請求的json形式參數
"""
id = models.AutoField(primary_key=True)
automationCaseApi = models.OneToOneField(AutomationCaseApi, related_name='headerRaw',
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格式參數管理'

ModelSerializer如下:
class AutomationCaseApiParamSerializer(serializers.ModelSerializer):
"""
自動化用例接口入參信息序列化
"""
headerRaw = serializers.SerializerMethodField()

def get_headerRaw(self, obj):
if obj.headerRaw:
return obj.headerRaw.data
return None

class Meta:
model = AutomationCaseApi
fields = ('id', 'name', 'apiAddress', 'parameterRaw', 'responseParameterRaw', 'headerRaw')
 
通過serializers.SerializerMethodField 和鈎子方法結合obj.related_name得到choice類數據



 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM