#python #json #django #postgresql
#python #json #django #postgresql
Вопрос:
Я пытаюсь создать представление Django, которое возвращает данные JSON из Postgres (т. Е. Данные из Postgres уже имеют тип JSON).
Я использую сервер разработки Django и 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. В вашей среде разработки это выглядит как
cursor.fetchone()[0]
returningtext
(str
), поэтому он не сериализуется должным образом в JSON. В то время как в вашей производственной средеcursor.fetchone()[0]
возвращаетсяjson
(dict
).
Ответ №1:
У меня тоже было нечто подобное. Мой sql возвращал json. Django в моей среде разработки превращал json в словарь, содержащий список списков, но django в рабочей среде возвращал словарь, содержащий список строк.
Проблема, с которой я столкнулся, заключалась в разных версиях psycopg2. Я использовал 2.5 в разработке, но 2.4 в производстве.
Проверьте все свои пакеты, чтобы убедиться, что ваша среда разработки совпадает с вашей производственной средой.