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. MySQL5.6解压版服务无法启动—系统错误1067

    记录一下今天被坑了一下午的BUG 就从半个月前说起吧 当时....................................................................... ...

  2. 死磕并发之CountDownLatch解析

    CountDownLatch解析 CountDownLatch是什么 CountDownLatch是基于AQS的阻塞工具,阻塞一个或者多个线程,直到所有的线程都执行完成. CountDownLatch ...

  3. 2017.10.21 C组比赛总结

    今天考得不太好,只拿了100+0+0+30=130分... [GDKOI训练]音乐节拍 考场AC了! 其实就是大水一道! 思路:二分查找 每次输入后,输出该时刻所在的区间的编号就好了. 总体难度:★★ ...

  4. 第一次参赛经历:ecfinal总结

    刚接到要去参加ec的消息时,还是非常激动的,毕竟第一次参赛就参加如此高水平的编程竞赛(更高水平的比赛就是wf). 教练临时组队,把三个从没在一起打过比赛的三个人组成一队,当时有点担心默契和配合上的问题 ...

  5. IntelliJ IDEA 远程调试 Tomcat 的方法

    在调试代码的过程中,为了更好的定位及解决问题,有时候需要我们使用远程调试的方法.在本文中,就让我们一起来看看,如何利用 IntelliJ IDEA 进行远程 Tomcat 的调试. 首先,配置remo ...

  6. ajax异步 —— javascript

    目录 ajax是什么 原生ajax jquery ajax ajax跨域 ajax是什么 作用:不必重新加载整个页面,更新部分页面内容. 大概使用过程:通过后台提供的数据接口,ajax获取数据,动态修 ...

  7. 20180115-Xcode创建多个工程协同开发

    今天研究了一下在Xcode中创建多个工程,达到模块化的目的的同时,实现多个相似项目的协同开发,最主要的是可以实现多工程连编.项目的效果如下: 接下来创建一个这样的项目,以及他们之间的通信 1.建一个文 ...

  8. Linux上安装JDK1.8,tomcat9,以及mysql8的步骤

    (该篇是在centos7上安装JDK1.8.0_201  tomcat9.0.16 和 mysql8.0.15) 一.安装JDK 方式一 1.首先,下载JDK(链接http://www.oracle. ...

  9. python-装饰器2

    python-装饰器2 1.函数既“变量 def bar(): print("in the bar") def foo(): print("in the foo" ...

  10. QWidget 设置背景图片

    QWidget 设置背景图片办法: 利用 QPaltette QPixmap pixmap("back.png"); QPalette palette; palette.setBr ...