详解从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操作MySQL数据库具体方法
Oct 28 Python
Python实现向QQ群成员自动发邮件的方法
Nov 19 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
深入Python解释器理解Python中的字节码
Apr 01 Python
python如何实现代码检查
Jun 28 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
python 求定积分和不定积分示例
Nov 20 Python
Django ModelForm操作及验证方式
Mar 30 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
python实现批量移动文件
Apr 05 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
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
js 数组操作代码集锦
2009/04/28 Javascript
犀利的js 函数集合
2009/06/11 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python使用Apriori算法进行关联性解析
2017/12/21 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
WxPython建立批量录入框窗口
2019/02/27 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
群众路线教育实践活动心得体会
2014/03/07 职场文书
安全生产活动月方案
2014/03/09 职场文书
安全生产计划书
2014/05/04 职场文书
财务部绩效考核方案
2014/05/04 职场文书
元旦晚会活动总结
2014/07/09 职场文书
聘用意向书
2014/07/29 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle