详解从Django Rest Framework响应中删除空字段

我使用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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Django 响应数据response的返回源码详解

    响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由此得到响应数据对象 response. 如今所要做的, 便是将其返回给客户端. 在 Django 源码小剖: 初探 WSGI中, 简要的概括了请求到来时 django 自带服务器的执行关系, 摘抄如下: make_server() 中 WSGIServer 类已经作为服务器类, 负责接收请求, 调用

  • Django框架的使用教程路由请求响应的方法

    路由 路由可以定义在工程的目录下(看你的需求),也可以定义在各个应用中来保存应用的路由,用主路文件urls中使用include()包含各个应用的子路由的数据 路由的解析顺序 Django接收到请求后,从主路由文件urlpatterns中的路由从上倒下顺序查找,如果有include包含,则进入子应用的urls中的urlpatterns中查找(从上而下) 路由的结尾斜线 Django有/结尾路由,用户不需要加/,就可以直接重定向到/结尾的路径上 路由命名(可以避免不同应用使用相同名字发生冲突) 如:

  • 在Python的Django框架中用流响应生成CSV文件的教程

    在Django里,流式响应StreamingHttpResponse是个好东西,可以快速.节省内存地产生一个大型文件. 目前项目里用于流式响应的一个是Eventsource,用于改善跨系统通讯时用户产生的慢速的感觉.这个不细说了. 还有一个就是生成一个大的csv文件. 当Django进程处于gunicorn或者uwsgi等web容器中时,如果响应超过一定时间没有返回,就会被web容器终止掉,虽然我们可以通过加长web容器的超时时间来绕过这个问题,但是毕竟还是治标不治本.要根本上解决这个问题,Py

  • django rest framework之请求与响应(详解)

    前言:在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我们还知道RESTful API的另一个特性就是,发送不同的请求动作,会返还不同的响应,这篇文章就讲一下django-rest-framework这个工具在这方面给我们带来的便捷操作. 一.Request对象 平时我们在写Django的视图函数的时候,都会带上一个request参数,这样就能处理平时搭建网站时,浏览器访问网页时发出的常规的HttpReques

  • Django框架HttpResponse对象用法实例分析

    本文实例讲述了Django框架HttpResponse对象用法.分享给大家供大家参考,具体如下: 1.HttpResponse 可通过HttpResponse构造响应对象: HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码) 响应头可以直接将HttpResponse对象当做字典进行响应头键值对的设置: response = HttpResponse() response['itcast'] = 'Python' # 自定义响应头

  • django从请求到响应的过程深入讲解

    django启动 我们在启动一个django项目的时候,无论你是在命令行执行还是在pycharm直接点击运行,其实都是执行'runserver'的操作,而ruserver是使用django自带的的web server,主要用于开发和调试中,而在正式的环境中,一般会使用nginx+uwsgi模式. 无论是哪种方式,当启动一个项目,都会做2件事: 创建一个WSGIServer类的实例,接受用户的请求. 当一个用户的http请求到达的时,为用户指定一个WSGIHandler,用于处理用户请求与响应,这

  • Django使用HttpResponse返回图片并显示的方法

    做了一个关于Django的小案例,想要在网页中显示图片,直接在img标签的src属性写图片的路径是不能显示的,查询资料发现在Django中使用图片这类的资源相当繁琐需要进行一定D的配置,摸索了一会没有整明白,想到了写Java时使用文件流返回图片,于是想到使用该种方式来显示图片. 使用实例如下: views.py def my_image(request,news_id): d = path.dirname(__file__) #parent_path = path.dirname(d) prin

  • Django的HttpRequest和HttpResponse对象详解

    本文研究的主要是Django的HttpRequest和HttpResponse对象的相关内容,具体如下. 请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个HttpRequest 对象作为第一个参数传给view方法.任何view方法都应该返回一个HttpResponse对象. 我们在本书中大量使用这两个对象:本附录详细解释HttpRequest和HttpResponse对象. HttpRequest Htt

  • Django 中使用流响应处理视频的方法

    起步 利用 html5 的 <video> 标签可以播放: <video width="320" height="240" controls> <source src="/static/video/demo.mp4" type="video/mp4"> 您的浏览器不支持Video标签. </video> 但是这样的方式,视频中的进度条无法使用,而且以静态文件方式返回的话,后台的程

  • 从请求到响应过程中django都做了哪些处理

    前言 最近面试的时候,被面试官问道一个问题,就是 request.user 里面的 user 是怎样得到的,这个问题当时没有回答上来,可以说是非常的尴尬,所以赶快查了一些资料,看了一些源码,特地来总结一下这个问题. 要想回答为什么可以直接通过 request.user 得到请求的用户,应该先来看看请求被处理以及如何返回响应的流程.今天先总结一下 django 从请求到响应都进行了哪些过程. WSGI 当客户端发送一次请求后,最先处理请求的实际上是 web 服务器就是我们经常说的 nginx.Ap

  • django创建简单的页面响应实例教程

    首先 编辑views.py文件 每个响应对应一个函数 函数必须返回一个响应 函数必须存在一个参数 一般约定为request 每个响应函数 对应一个URL from django.shortcuts import render from django.http import HttpResponse # Create your views here. def book(request): return HttpResponse('图书') 配置URL 编辑URLS.py 每个url都以url的形式

  • Django使用httpresponse返回用户头像实例代码

    本文研究的主要是Django使用httpresponse返回用户头像,下面是相关实例代码. 当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个参数传给 view 方法.任何 view 方法都应该返回一个 HttpResponse 对象. 代码示例: def test(request): # 获取当前文件的路径.父路径以及下一层的路径 curr_di

随机推荐