详解从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之禅》中对于Python编程过程中的一些建议
Apr 03 Python
python中列表元素连接方法join用法实例
Apr 07 Python
Django中反向生成models.py的实例讲解
May 30 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
linux环境中没有网络怎么下载python
Jul 07 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
sklearn+python:线性回归案例
Feb 24 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Python 如何实现数据库表结构同步
Sep 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
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
python实现年会抽奖程序
2019/01/22 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
Python2与Python3的区别详解
2020/02/09 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
空字符串(“”)和null的区别
2012/11/13 面试题
Linux文件操作命令都有哪些
2016/07/23 面试题
函授毕业个人自我评价
2014/02/20 职场文书
课外访万家心得体会
2014/09/03 职场文书
合同纠纷调解书
2015/05/20 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL