需求:在使用django rest framework serializer在model 中定义的model时,当需要额外在serializer中增加一些model中没有的字段。

方法一修改数据库,利用model,在这就不详细说了。

方法二,不修改django的model,直接使用SerializerMethodField(method_name=None)

假设我们现在有一个Animal模型,其中有name,type,country字段,其中country是外键。在序列化Animal时,需要额外增加country的area信息

class AnimalSerializer(serializers.ModelSerializer):country_area = serializers.SerializerMethodField()class Meta:model = Animalfields = ('id','name','type','country','country_area')def get_country_area(self,obj):return obj.country.area

SerializerMethodField是read-only字段,当不指定其method_name时,默认为get_field_name;如果使用ModelSerializer并指点字段时,要包含此时定义的字段。

补充知识:django restframework Serializer field

SerializerMethodField

这是一个只读字段。它通过调用它所连接的序列化类的方法来获得它的值。它可用于将任何类型的数据添加到对象的序列化表示中。

签名: SerializerMethodField(method_name=None)

method_name - 要调用序列化对象的方法的名称。如果不包含,则默认为 get_<field_name>.

由 method_name 参数引用的序列化方法应该接受一个参数(除了 self),这是要序列化的对象。它应该返回你想要包含在对象的序列化表示中的任何内容。例如:

场景介绍:一个用户往往对应多个角色,而角色字段并不在UserProfile表中,这就需要我们新增角色字段到user序列化中

from .models import UserProfile
from .models import UserRoleclass UserProfileSerializer(serializers.ModelSerializer):"""show list serializer"""role = serializers.SerializerMethodField()class Meta:model = UserProfile# fields = "__all__"fields = ["id", "username","role", "account", "really_name", "department", "tel_phone", "create_time", "email","last_time", "creator"]def get_role(self,obj):user_id = obj.idroles = [i.role.name for i in UserRole.objects.filter(user_id=user_id)]roles = ",".join(roles)return roles

相反的场景:我们提交的表单数据存在于多表中(因为表中含有多对多字段),如何验证所有字段,并保存完整的数据到各表中。

刚开始的思路在ModelSerializer中新增未定义字段,然后发现这并不可行。我也犯了SerializerMethodField的错误,但随后去读了serializer的源码,以及了解serializer的顺序,就知道SerializerMethodField仅用于list方法。

问题的突破点到底在哪里呢,在drf serializer 官方文档中就有一个知识点,serializer.save(**kwargs),kwargs数据被绑定在serializer.validated_data对象上,当create或update的时候就会被添加进数据库,相当于validated_data.update(kwargs)

实际源码不是这样子,但也就是这么个意思。

重写Serializer create,update方法

from rest_framework.utils import model_metadef create(self, validated_data):field= validated_data.pop('field_name')validated_data = validated_datainstance = Model.objects.create(**validated_data)# ...外键表的操作return instancedef update(self, instance, validated_data):field= validated_data.pop('field_name')info = model_meta.get_field_info(instance)for attr, value in validated_data.items():if attr in info.relations and info.relations[attr].to_many:field = getattr(instance, attr)field.set(value)else:setattr(instance, attr, value)instance.save()# ...return instance

django rest framework serializer 增加自定义字段相关推荐

  1. SD--如何在输出控制中增加自定义字段

    在sap的输出控制中,我们有时需要增加系统未定义的字段作为条件表的字段,为了实现该需求我们就需要修改增强. 输出控制用到的通讯结构 KOMKBK1 (Output Determination Comm ...

  2. Camstar CDO增加自定义字段

    本节讲述如何在Camstar原生CDO里加入自定义字段 进入Designer,打开CDO页,找到要增加字段的CDO,打开,切换到Fields页,点击下面的Add按钮. 在弹出的窗口中,输入相应的数据: ...

  3. 帝国模板留言板增加自定义字段教程

    下面这段是加在form内的,把原form内的替换掉: <table width="92%" border="0" align="center&q ...

  4. Django REST Framework中的Serializer relations

    官方文档原文 Relational fields are used to represent model relationships. They can be applied to ForeignKe ...

  5. phpcms教程:调用自定义字段的方法

    新增加自定义字段: moke8 调用新增字段代码: {pc:content action="lists" catid="$catid" num="10 ...

  6. 微信企业号:员工信息自定义字段

     一. 通讯录员工基本信息 包括:姓名.头像.性别.所属部门.账号.手机.邮箱.职位和微信,这些字段是员工的基本信息,不能删除. 如果需要增加其他字段信息,则需要先在企业微信号中设置. 二.增加自 ...

  7. Django REST Framework教程(4): 玩转序列化器(Serializer)

    在前面的文章中我们以博客为例,自定义了一个简单的 ArticleSerializer 类, 并分别以函数视图(FBV)和基于类的视图(CBV)编写了博客文章列表资源和单篇文章资源的API,支持客户端以 ...

  8. django序列化器嵌套_Django Rest Framework中用于OneToOne字段的序列化程序中的嵌套关​​系

    django序列化器嵌套 The Django Rest Framework (DRF) is one of the effectively written frameworks around Dja ...

  9. django调用python脚本返回_讲解django rest framework 自定义返回方法

    讲解django rest framework 自定义返回方法 大家在用Django Rest Framework的时候会发现默认继承后,增删改查的返回信息都是一段data,这是因为我实际是状态码和信 ...

  10. 源码剖析Django REST framework的认证方式及自定义认证

    源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_vie ...

最新文章

  1. SpringBoot巧用 @Async 提升API接口并发能力
  2. 使用字节流读取中文的问题
  3. 面向对象分析的三个模型与5个层次
  4. 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).
  5. ASI进行POST网络请求
  6. Shell自动上传下载文件到SFTP服务器
  7. “安防+人工智能”,安企选择哪种抱大腿姿势才有出息?
  8. C语言和设计模式(命令模式)
  9. 团队计划(4.22)
  10. [OHOS ERROR] clang not found, install it please
  11. 通达信实现自动交易系统
  12. 分子动力学模拟软件VMD的安装与使用
  13. winrar64位怎么破解
  14. VS201-无法打开源文件hpp(或链接库文件)的解决方法
  15. ECMAScript
  16. 华为云云原生之多云管理利器Karmada从0到1的实操【与云原生的故事】
  17. win7使用笔记本做wifi热点
  18. 阿里内部使用的12 款开发工具,很多人可能都没听过
  19. “程序猿”面试篇(一)聊项目
  20. Batch Normalization介绍

热门文章

  1. 差分脉冲编码调制(DPCM)编码过程详解
  2. C++ Primer 第5版--练习9.31
  3. SDRAM控制器——添加读写FIFO
  4. Unity3D AABB包围盒效果
  5. Android 用代码获取基站号(cell)和小区号(lac)
  6. 20220906_C52单片机学习笔记 | LED闪烁
  7. 【已解决】java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
  8. 市场调研-全球与中国天线测量系统市场现状及未来发展趋势
  9. fw150rm刷openwrt固件_迅捷FW150R刷TP741N后再刷Openwrt和DDWRT以及固件还原
  10. toolchain安装教程支持_【转】Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法...