详解从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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
python实现mysql的单引号字符串过滤方法
Nov 14 Python
Python实现文件复制删除
Apr 19 Python
最大K个数问题的Python版解法总结
Jun 16 Python
使用Python绘制图表大全总结
Feb 11 Python
Python编程之序列操作实例详解
Jul 22 Python
Python与R语言的简要对比
Nov 14 Python
50行Python代码实现人脸检测功能
Jan 23 Python
python中的字符串内部换行方法
Jul 19 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
如何在Win10系统使用Python3连接Hive
Oct 15 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
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Python面向对象编程基础解析(一)
2017/10/26 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
python实现字典嵌套列表取值
2019/12/16 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
linux比较文件内容的命令是什么
2015/09/23 面试题
服装厂厂长岗位职责
2013/12/27 职场文书
最热门的自我评价
2013/12/30 职场文书
计算机相关的自我评价
2014/01/15 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
如何理解及使用Python闭包
2021/06/01 Python
python内置进制转换函数的操作
2021/06/02 Python