【问题标题】:JavaScript Null does not convert to NoneJavaScript Null 不会转换为 None
【发布时间】:2020-08-10 12:52:40
【问题描述】:
@parser_classes([MultiPartParser, FormParser])
@api_view(['POST', ])
def product_list(request):
    print(request.POST.get('key'))
    print(request.data.get('key'))
    print(request.FILES)

当我发送值为 key=null 的表单数据时,它将 null 显示为字符串,但没有转换为 None 我该怎么办。我必须做的工作 有点像

if request.data.get('key', None) in ['null', None]:
    #then do something

但这似乎不是一种干净的方式。那我该怎么办?

我预计 django 或 django rest 框架会自动将 null 转换为 None。

【问题讨论】:

  • 可能你的request.data 是一个JSON 对象。并且 JSON 不知道 Python 特定的None,而是存储null。您可以尝试将 JSON 对象加载到dict,这会将null 转换为None
  • @AnsFourtyTwo request.data 只是解析后的实体主体(它是 POST 数据的超集),在作者将 JSON 值推入他们的 POST 数据之前,不涉及 JSON。

标签: python python-3.x django django-rest-framework


【解决方案1】:

在 HTTP 表单数据内容中没有 null/none 之类的东西(事实上,没有我们通常理解的类型之类的东西,尽管每个项目都可以有一个内容类型)。

所以这里发生的事情是在 javascript 一侧,null 被转换为字符串,添加到数据中,发送到服务器,它只是得到一个 null 字符串而没有更多信息。

通常,“null”项目会完全丢失,或者,它们会有一个与之关联的空值。

无论如何,这不是 django 的问题。

【讨论】:

    【解决方案2】:

    我通过设计一个中间件做了一个小变通来解决这个问题。我不知道它是否好,但它对我有用。我先把它变成可变的,然后改变它然后再变成不可变的。

    注意:如果发送的数据是嵌套的 json,则必须对其进行更改以递归处理 json。

    from django import http
    from django.utils.deprecation import MiddlewareMixin
    
    
    class NullStringToNoneMiddleware(MiddlewareMixin):
        """Responsible for converting all string null values to None"""
        def process_request(self, request):
            request.POST._mutable = True
            for j in request.POST:
                if request.POST[j] == 'null':
                    request.POST[j] = None
            request.POST._mutable = False
    

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 2016-06-25
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多