详解从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中的pass语句使用方法讲解
May 14 Python
Python3中的2to3转换工具使用示例
Jun 12 Python
python变量不能以数字打头详解
Jul 06 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
安装Python的教程-Windows
Jul 22 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
Python读写/追加excel文件Demo分享
May 03 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
python使用response.read()接收json数据的实例
Dec 19 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
使用Pycharm分段执行代码
Apr 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
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
师范大学音乐表演专业求职信
2013/10/23 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
文案策划求职信
2014/04/14 职场文书
设计专业自荐信
2014/06/19 职场文书
物业管理专业自荐信
2014/07/01 职场文书
明星邀请函
2015/02/02 职场文书
物业公司管理制度
2015/08/05 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis