【问题标题】:request.data in DRF v/s serializers.data in DRFDRF 中的 request.data 与 DRF 中的 serializers.data
【发布时间】:2020-05-14 16:28:13
【问题描述】:

DRF 中的 request.data 和 DRF 中的 serializers.data 有什么区别。

当我在 DRF 中编写基于函数的视图时,我会像使用它们一样 -

        elif request.method == 'POST':  

        serializer = datesSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()   

和,

        startdate = serializer.data['startdate']
        enddate = serializer.data['enddate']

但找不到它们的区别以及在代码中使用它们的区别。

【问题讨论】:

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


    【解决方案1】:

    在使用 Rest API 时,我们在“请求”中接收来自客户端的数据,当我们打印 request.data 时,它将打印客户端提交的所有信息。

    serializers.data 主要用于发送给客户端或最终用户的数据。有时我们的数据库有一些值以这样的方式排列,它们不是 json 可序列化的(假设我们不能将它们发送到客户端),所以序列化器是将数据转换为可以传输到客户。

    被序列化器解析的只是以准备发送给客户端的形式排列的数据。

    【讨论】:

      【解决方案2】:

      request.data 似乎是一个可能不好吃的生鸡蛋,并且包含有关请求的额外信息。根据您的序列化程序设置,Serializer.data 类似于煮熟的鸡蛋菜。

      并且 request.data 将用作序列化程序的输入。如果在检查序列化器的验证后请求数据有效,则可以保存序列化器以创建对象实例。如果不是,则序列化程序无效。如果所有这些过程都成功,您就可以访问 serializer.data ,它是一个格式化的字典。

      这是 DRF 中request data 的定义。

      request.data returns the parsed content of the request body. This is similar to the standard request.POST and request.FILES attributes except that:
      
      It includes all parsed content, including file and non-file inputs.
      It supports parsing the content of HTTP methods other than POST, meaning that you can access the content of PUT and PATCH requests.
      It supports REST framework's flexible request parsing, rather than just supporting form data. For example you can handle incoming JSON data in the same way that you handle incoming form data.
      For more details see the parsers documentation.
      

      这里是 request.data 的一个例子

      {
         "csrfmiddlewaretoken":[
            "RrwwZyZCmEElmGG16muxEopwXbRZDsARYcDjraIC1kmcjEux3OIOZoeG7XUSmL4V"
         ],
         "email":[
            "myqepuzez@mailinator.com"
         ],
         "first_name":[
            "Roary"
         ],
         "last_name":[
            "Daugherty"
         ],
         "password":[
            "In quam qui magni re"
         ],
         "phone":[
            "+1 (542) 262-5207"
         ],
         "username":[
            "tikit"
         ]
      }
      

      以及序列化器的数据示例:

      {
         "id":3,
         "group_ids":[
         ],
         "role_ids":[
         ],
         "email":"myqepuzez@mailinator.com",
         "first_name":"Roary",
         "is_active":False,
         "last_name":"Daugherty",
         "phone":"+1 (542) 262-5207",
         "username":"tikit"
      }
      

      【讨论】:

        【解决方案3】:

        request.data 是作为request 对象一部分的数据。

        REST 框架引入了一个请求对象,该对象扩展了常规 HttpRequest,并提供更灵活的请求解析。核心 Request 对象的功能是 request.data 属性, 类似于 request.POST,但对使用 Web 更有用 API。

        https://www.django-rest-framework.org/tutorial/2-requests-and-responses/#request-objects

        serializer.data是已经被序列化器解析的数据。

        返回传出的原始表示

        https://www.django-rest-framework.org/api-guide/serializers/#baseserializer

        参考:request.data in DRF vs request.body in Django

        【讨论】:

        • 请解释一下由序列化程序和请求对象解析是什么意思。谢谢你
        猜你喜欢
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 2021-12-06
        • 2022-06-18
        • 1970-01-01
        相关资源
        最近更新 更多