详解从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正则表达式匹配ip地址实例
Oct 09 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
Pytorch 实现focal_loss 多类别和二分类示例
Jan 14 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
python实现打砖块游戏
Feb 25 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 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变量修饰符static的使用
2013/06/28 PHP
php单一接口的实现方法
2015/06/20 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
常用DOM整理
2015/06/16 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
python进阶教程之模块(module)介绍
2014/08/30 Python
深入学习Python中的装饰器使用
2016/06/20 Python
详解爬虫被封的问题
2019/04/23 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
逻辑链路控制协议
2016/10/01 面试题
计算机科学与技术专业求职信
2014/09/03 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript