Django API中PostgreSQL过程/函数输出错误



我已经在PostgreSQL中准备好了数据库及其所有过程。我以前使用Laravel作为我的API的后端,所有的过程都正常工作并返回正确的输出。

我的一个API调用的Laravel控制器函数如下:

public function retrieve() {
$data = DB::select(DB::raw("SELECT * FROM showallmenuitem()"));
$status = count($data);
return $status ? response(['message'=>'Menu item retrieved successfully','data' =>$data],200):response(['message'=>'Failed to retrieve menu item.']);
}

此方法调用showallmenuitem()过程,存储在$data变量中的输出如下:

{
"message": "Menu item retrieved successfully",
"data": [
{
"meniuid": 1,
"menuitemsname": "User"
},
{
"meniuid": 2,
"menuitemsname": "Payment"
}
]
}

但最近我把我的后端从Laravel改为Django,因为我的应用程序中需要一些人工智能功能,而且我需要的人工智能模型是用python编写的。所以我创建了一个简单的视图来调用Django中的相同过程。我期望得到与Laravel相同的输出,但Django给我的输出格式错误。我使用psycopg2作为数据库驱动程序。这是我的Django视图代码:

@csrf_exempt
def retrieve(request):
if request.method == 'GET':
with connection.cursor() as cursor:
cursor.callproc("showallmenuitem")
results = cursor.fetchall()
response = {
'message'       :   'Menu items retrieved successfully',
'data'          :   results
}
return JsonResponse(response, safe=False, status= 200)

我得到了以下格式的输出:

{
"message": "Menu items retrieved successfully",
"data": [
[
1,
"User"
],
[
2,
"Payment"
],
]
}

Note:我也尝试过运行execute函数,而不是下面写的callproc,但仍然得到相同的输出。

with connection.cursor() as cursor:
cursor.execute("SELECT * FROM showallmenuitem()")
results = cursor.fetchall()

所以我的问题是如何在Django中获得正确json格式的输出,就像我从Laravel中获得的那样?

默认情况下,psycopg2返回一个元组列表,您可以看到它作为数组数组转换为JSON。要改变这一点,请参阅此处:

https://docs.djangoproject.com/en/3.0/topics/db/sql/

直接执行自定义SQL

默认情况下,Python DB API将返回不带字段名称的结果,这意味着您最终得到的是一个值列表,而不是一个dict。只需少量的性能和内存成本,您就可以使用以下内容将结果作为dict返回:

def dictfetchall(cursor):
"Return all rows from a cursor as a dict"
columns = [col[0] for col in cursor.description]
return [
dict(zip(columns, row))
for row in cursor.fetchall()
]

最新更新