详解从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与Redis的连接教程
Apr 22 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
Python新手学习标准库模块命名
May 29 Python
解决pip install psycopg2出错问题
Jul 09 Python
python中的垃圾回收(GC)机制
Sep 21 Python
python自动化办公操作PPT的实现
Feb 05 Python
解决virtualenv -p python3 venv报错的问题
Feb 05 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
Python基础之数据类型知识汇总
May 18 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 magic quotes的详解
2013/06/17 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
python批量修改文件名的实现代码
2014/09/01 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
上课迟到检讨书100字
2014/01/11 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
安装工程师岗位职责
2015/02/13 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python
OpenCV实现普通阈值
2021/11/17 Java/Android
python装饰器代码解析
2022/03/23 Python
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸