详解从Django Rest Framework响应中删除空字段


Posted in Python onJanuary 11, 2019

我使用django-rest-framework开发了一个API.

我正在使用ModelSerializer返回模型的数据.

models.py

class MetaTags(models.Model):
 title = models.CharField(_('Title'), max_length=255, blank=True, null=True)
 name = models.CharField(_('Name'), max_length=255, blank=True, null=True)

serializer.py

class MetaTagsSerializer(serializers.ModelSerializer):
 class Meta:
  model = MetaTags

响应

{
 "meta": {
  "title": null,
  "name": "XYZ"
 }
}

理想情况下,在API响应中,不应在响应中发送任何不存在的值.

当标题为null时,我希望响应为:

{
 "meta": {
  "name": "XYZ"
 }
}

您可以尝试覆盖to_native函数:

class MetaTagsSerializer(serializers.ModelSerializer):
 class Meta:
  model = MetaTags

 def to_native(self, obj):
  """
  Serialize objects -> primitives.
  """
  ret = self._dict_class()
  ret.fields = self._dict_class()

  for field_name, field in self.fields.items():
   if field.read_only and obj is None:
    continue
   field.initialize(parent=self, field_name=field_name)
   key = self.get_field_key(field_name)
   value = field.field_to_native(obj, field_name)

   # Continue if value is None so that it does not get serialized.
   if value is None:
    continue

   method = getattr(self, 'transform_%s' % field_name, None)
   if callable(method):
    value = method(obj, value)
   if not getattr(field, 'write_only', False):
    ret[key] = value
   ret.fields[key] = self.augment_field(field, field_name, key, value)

  return ret

我基本上从serializers.BaseSerializer复制了基本的to_native函数,并添加了一个值的检查.

更新:

至于DRF 3.0,to_native()被重命名为to_representation(),其实现稍有改变.这是DRF 3.0的代码,它忽略空值和空字符串值:

def to_representation(self, instance):
 """
 Object instance -> Dict of primitive datatypes.
 """
 ret = OrderedDict()
 fields = self._readable_fields

 for field in fields:
  try:
   attribute = field.get_attribute(instance)
  except SkipField:
   continue

  # KEY IS HERE:
  if attribute in [None, '']:
   continue

  # We skip `to_representation` for `None` values so that fields do
  # not have to explicitly deal with that case.
  #
  # For related fields with `use_pk_only_optimization` we need to
  # resolve the pk value.
  check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute
  if check_for_none is None:
   ret[field.field_name] = None
  else:
   ret[field.field_name] = field.to_representation(attribute)

 return ret

翻译自:https://stackoverflow.com/questions/27015931/remove-null-fields-from-django-rest-framework-response

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python多进程multiprocessing用法实例分析
Aug 18 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
在python中安装basemap的教程
Sep 20 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
Python求凸包及多边形面积教程
Apr 12 Python
django rest framework serializers序列化实例
May 13 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
学会Python数据可视化必须尝试这7个库
Jun 16 Python
python对列进行平移变换的方法(shift)
Jan 10 #Python
对python模块中多个类的用法详解
Jan 10 #Python
python 图像平移和旋转的实例
Jan 10 #Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 #Python
详解pandas安装若干异常及解决方案总结
Jan 10 #Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 #Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 #Python
You might like
PHP判断上传文件类型的解决办法
2015/10/20 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
用 JSON 处理缓存
2007/04/27 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
python dict remove数组删除(del,pop)
2013/03/24 Python
python实现udp数据报传输的方法
2014/09/26 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
Python文件操作基本流程代码实例
2017/12/11 Python
对python 自定义协议的方法详解
2019/02/13 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
python ftplib模块使用代码实例
2019/12/31 Python
Python 读取位于包中的数据文件
2020/08/07 Python
python中实现栈的三种方法
2020/12/19 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
Melissa香港官网:MDreams
2016/07/01 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
会计专业求职信范文
2014/03/16 职场文书
环保倡议书100字
2014/05/15 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书