【问题标题】:Object of type Response is not JSON serializable in rest frameworkResponse 类型的对象在 rest 框架中不是 JSON 可序列化的
【发布时间】:2022-01-28 20:10:50
【问题描述】:

我正在尝试将一种方法响应调用到 Django REST 框架中的另一种方法中。

views.py:

@api_view(['GET','POST'])
def GetCurrentRunningActivityForAudit(request, UserID):

    if request.method == 'GET':
        
   
        print("current running activity--userid--", UserID)
        cursor = connection.cursor()
        cursor.execute('EXEC [dbo].[sp_GetCurrentRunningActivityAudit] @UserId=%s',(UserID,))
        result_set = cursor.fetchall()
       
        data = []
        for row in result_set:
            TaskId=row[0]           
            TaskName = row[1]
            Source = row[2]
            SID = row[3]
            type = row[4]
           
            data.append({
                    "TaskId": TaskId, "TaskName":TaskName,"Source":Source,
                    "SID":SID, "type":type, "IsActive":GetCurrentSubTaskSTatus(TaskId)})
        

            return Response(data[0])   
        return Response(data)    

我将此方法响应传递给上述方法响应,即。 GetCurrentRunningActivityForAudit 但它显示为响应类型的对象不是 JSON 可序列化的

def GetCurrentSubTaskSTatus(taskid):

    cursor = connection.cursor()
    cursor.execute('EXEC [dbo].[USP_GetCurrentTaskStatus] @taskid=%s',(taskid,))
    result_set = cursor.fetchall()
    for row in result_set:
        IsActive =row[0]
    return Response({"IsActive":IsActive})
     

【问题讨论】:

  • 为什么GetCurrentSubTaskSTatus 返回一个Response 而不仅仅是一个字典,它不是一个视图并且它的返回值被用作另一个字典的一部分?
  • GetCurrentSubTaskStatus 返回存储过程的响应,该响应应该用于 GetCurrentRunningActivityForAudit 响应
  • Response 对象是应该从 API 视图返回的 HTTP 响应,它并不意味着从只返回一些结果的函数返回。从GetCurrentSubTaskSTatus 函数中删除它并返回一个字典

标签: django django-rest-framework django-views


【解决方案1】:

您收到此错误是因为您将一个字典以 Response 作为键 IsActive 的值传递给 Response 类。

请记住,Response clas 不返回 JSON,而是返回完整的 Response 对象,并且它需要一个字典作为输入,这就是你得到错误的原因。

An object of type Response is not JSON serializable

如果你想解决这个问题,你可以通过从这一行删除 Removing Response 来做到这一点

 return Response({"IsActive":IsActive})

你需要写得简单


 return {"IsActive":IsActive}

视图响应将处理嵌套字典,因此您不必担心。

更正在这里

def GetCurrentSubTaskSTatus(taskid):

    cursor = connection.cursor()
    cursor.execute('EXEC [dbo].[USP_GetCurrentTaskStatus] @taskid=%s',(taskid,))
    result_set = cursor.fetchall()
    for row in result_set:
        IsActive =row[0]
    return {"IsActive":IsActive}

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 2021-12-03
    • 2020-07-05
    • 2019-09-28
    • 2022-07-01
    • 2023-01-10
    • 2019-04-29
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多