详解从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开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
详解爬虫被封的问题
Apr 23 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
wxPython实现画图板
Aug 27 Python
django-crontab实现服务端的定时任务的示例代码
Feb 17 Python
Python实现Wordcloud生成词云图的示例
Mar 30 Python
Python3爬虫关于识别点触点选验证码的实例讲解
Jul 30 Python
python 实现控制鼠标键盘
Nov 27 Python
深入理解Python变量的数据类型和存储
Feb 01 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 文件缓存函数
2011/10/08 PHP
javascript实现yield的方法
2013/11/06 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
javascript每日必学之封装
2016/02/23 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
如何使用angularJs
2017/05/08 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
Vue基于NUXT的SSR详解
2017/10/24 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
浅谈python中的变量默认是什么类型
2016/09/11 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
C语言笔试题回忆
2015/04/02 面试题
linux面试题参考答案(6)
2016/06/23 面试题
家长会学生演讲稿
2014/04/26 职场文书
公司贷款承诺书
2014/05/30 职场文书
社区服务活动小结
2014/07/08 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
申请吧主发表的感言
2015/08/03 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python