详解从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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
python生成圆形图片的方法
Mar 25 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
python实现多线程网页下载器
Apr 15 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
Python玩转PDF的各种骚操作
May 06 Python
Python字符串对象实现原理详解
Jul 01 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 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
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
php实现webservice实例
2014/11/06 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
js实现图片轮播效果
2015/12/19 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
深入学习Python中的上下文管理器与else块
2017/08/27 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
总务岗位职责
2013/11/19 职场文书
元旦获奖感言
2014/03/08 职场文书
酒店开业策划方案
2014/06/02 职场文书
会计专业求职信
2014/08/10 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书
python基础之while循环语句的使用
2021/04/20 Python
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript