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类数据


												

ModelSerializer 使用知识点_serializers.SerializerMethodField()使用场景总结的更多相关文章

  1. 第十九个知识点:Shamir密钥交换场景

    第十九个知识点:Shamir密钥交换场景 Shamir密钥交换场景是一个被Adi Shamir提出的算法.算法允许多方分割一个密码,例如一个密钥.当足够多的秘密结合起来,整个密钥就被计算出来了. 正式 ...

  2. ModelSerializer 使用知识点_序列化和反序列化用法区别

    1.ModelSerializer  如下 from api_test.errorCode.errorCode import Statusclass RelatedbSerializer(serial ...

  3. ModelSerializer 使用知识点_serializer.save(project=obj) #外键一定要作为实例传入save函数,否则无法新增成功

    1.有两个模型如下 A.project class Project(models.Model): """ 项目表 """ id = mode ...

  4. Django-rest-framework 接口实现 ModelSerializer 使用

    ModelSerializer 使用 不需要单独写字段的 序列化工具类 相当于 ModelForm 写法:以及 注意事项: 继承 serializers.ModelSerializer 在类中填写 c ...

  5. 阿里一面,说说你了解zookeeper的应用场景有哪些?

    1.前言 又到了金三银四的时候,大家都按耐不住内心的躁动,我在这里给大家分享下之前面试中遇到的一个知识点(zookeeper应用场景),希望对大家有些帮助.如有不足,欢迎大佬们指点指点. 2.zook ...

  6. [C#详解] (1) 自动属性、初始化器、扩展方法

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/CSharp-focus-1.html 代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属 ...

  7. IT修养-基础篇

    1.科学基础 成为开发人员的过程不尽相同,有的是科班出身,有的是兴趣爱好,还有的是专业机构的培训,在这个过程中,可能全面或者零散甚至没有学习过计算机基础学科,但无论是哪一种,想要成为更高层次的开发人员 ...

  8. 学好Python后可从事岗位+学习Python的难度

    一.学好Python好就业: 1.Linux运维.Linux运维是必须而且一定要掌握Python语言,Python可以满足Linux运维工程师的工作需求提升效率,总而提升自己的能力.用Python实现 ...

  9. “深度评测官”——记2020BUAA软工软件案例分析作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 完成一次完整的软件开发经历并以博客的方式记录开发 ...

随机推荐

  1. Qt - 基于UDP的网络编程

    UDP(用户数据报协议 User Data Protocol) 轻量级.不可靠.面向数据报.无连接  的传输层协议. 适用情况: 网络数据大多为短消息: 拥有大量客户端: 对数据安全无特殊要求: 网络 ...

  2. CDH日常运维

    1/ 作业有问题: 查log,没log再跑一次查log. 如果没有log的情况,比如hiveserver2挂了,查strr. 2/ 查集群名字 #看hdfs集群的名字,在cdh的hdfs配置中查:na ...

  3. 【6.28校内test】T1 Jelly的难题1

    Jelly的难题[题目链接] 废话一句:今天中考出成绩,感觉大家考的都超级棒,不管怎样,愿大家成为最好的自己. 好了废话完了,下面是题解部分: SOLUTION: 首先你可能发生的,是看不懂题: 定睛 ...

  4. POJ - 2421 Constructing Roads(最小生成树&并查集

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  5. 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解

    题面 这道题是一道标准的01分数规划: 但是有一些细节可以优化: 不难想到要二分一个mid然后判定图上是否存在一个环S,该环是否满足∑i=1t(Fun[vi]−mid∗Tim[ei])>0 但是 ...

  6. document与Object的关系

    window与Objet 1. window.__proto__ === Window.prototype 2. window.__proto__.__proto__ === 窗口属性(WindowP ...

  7. CNN与图像应用

    一.图像识别与定位 0.Classification:C个类别 Input:Image Output:类别标签 Evaluation metric:准确率 1.Localization: Input: ...

  8. vue报错——Module not found: Error: Can't resolve 'less-loader sass' in ...

    npm install sass-loader -D npm install node-sass -D

  9. vue.js 分页加载,向上滑动,依次加载数据。

    export default { layout: 'default', data(){ return{ page:1, pageSize:10, orderListArr:[], prodListLo ...

  10. Echarts-主题切换

    从网上搜索了相关的方法,是主题之前的切换,但是用的是下拉框类型的,也可以设置div样式,参考官网那种 设置一个div,通过三个图片的点击效果实现切换主题的功能 我用的jQuery和Echarts是cd ...