详解从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实现递归版汉诺塔示例(汉诺塔递归算法)
Apr 08 Python
在Python中实现贪婪排名算法的教程
Apr 17 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
python3.x上post发送json数据
Mar 04 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
Python简单处理坐标排序问题示例
Jul 11 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
通过实例解析python描述符原理作用
Jan 22 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
python import 上级目录的导入
Nov 03 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和ACCESS写聊天室(七)
2006/10/09 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
python操作mysql数据库
2017/03/05 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
django url到views参数传递的实例
2019/07/19 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
心得体会怎么写
2013/12/30 职场文书
简单的项目建议书模板
2014/03/12 职场文书
环境保护建议书
2014/08/26 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
react中的DOM操作实现
2021/06/30 Javascript