使用Django从Postgres导出JSON时的结果不一致

时间:2014-06-18 23:44:41

标签: python json django postgresql

我试图创建一个从Postgres返回JSON数据的Django视图(即Postgres的数据已经是JSON类型)。

我在开发环境中使用Django dev服务器和Postgres,在生产环境中使用Apache和Postgres(不同的服务器)。

此视图在我的开发环境中运行良好:

def my_custom_sql(request):
    cursor = connection.cursor()
    cursor.execute("... the query ...")
    return HttpResponse(cursor.fetchone(), mimetype="application/json")

但是我的生产环境中的输出是不同的。

为了使它在生产中工作,我改变了第四行:

    return HttpResponse(cursor.fetchone(), mimetype="application/json")

为:

    return HttpResponse(json.dumps(cursor.fetchone()[0]), mimetype="application/json")

这些是结果(我添加了行返回):

开发环境:

使用cursor.fetchone() - 更正

[{"date":"2014-06-12","count":3,"sum":3}, 
 {"date":"2014-06-13","count":null,"sum":3}, 
 {"date":"2014-06-14","count":null,"sum":3}, 
 {"date":"2014-06-15","count":null,"sum":3}, 
 {"date":"2014-06-16","count":null,"sum":3}, 
 {"date":"2014-06-17","count":null,"sum":3}]

使用json.dumps(cursor.fetchone()[0]) - 错误:不是真正的JSON。

"[{\"date\":\"2014-06-12\",\"count\":3,\"sum\":3}, \n
{\"date\":\"2014-06-13\",\"count\":null,\"sum\":3}, \n
{\"date\":\"2014-06-14\",\"count\":null,\"sum\":3}, \n
{\"date\":\"2014-06-15\",\"count\":null,\"sum\":3}, \n
{\"date\":\"2014-06-16\",\"count\":null,\"sum\":3}, \n
{\"date\":\"2014-06-17\",\"count\":null,\"sum\":3}]"

生产环境:(不同数据,忽略不计)

使用cursor.fetchone() - 不正确:注意python" u"字符串。

[{u'date': u'2014-06-11', u'count': 4, u'sum': 4},
{u'date': u'2014-06-12', u'count': 8, u'sum': 12},
{u'date': u'2014-06-13', u'count': 7, u'sum': 19},
{u'date': u'2014-06-14', u'count': 6, u'sum': 25},
{u'date': u'2014-06-15', u'count': 1, u'sum': 26},
{u'date': u'2014-06-16', u'count': 9, u'sum': 35},
{u'date': u'2014-06-17', u'count': 4, u'sum': 39}]

使用json.dumps(cursor.fetchone()[0]) - 更正

[{"date": "2014-06-11", "count": 4, "sum": 4},
{"date": "2014-06-12", "count": 8, "sum": 12},
{"date": "2014-06-13", "count": 7, "sum": 19},
{"date": "2014-06-14", "count": 6, "sum": 25},
{"date": "2014-06-15", "count": 1, "sum": 26},
{"date": "2014-06-16", "count": 9, "sum": 35},
{"date": "2014-06-17", "count": 4, "sum": 39}]

如何在我的生产和开发环境中获得相同的结果?

1 个答案:

答案 0 :(得分:3)

我也有类似的事情发生。我的sql正在返回json。我的开发环境中的Django将json变成了一个包含列表列表的字典,但生产中的django正在返回一个包含字符串列表的字典。

我遇到的问题是psycopg2的不同版本。我在开发中运行2.5,但在生产中运行2.4。

检查所有软件包,确保您的开发环境与生产环境相同。