Противоречивые результаты при экспорте JSON из Postgres с использованием Django

#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] returning text ( str ), поэтому он не сериализуется должным образом в JSON. В то время как в вашей производственной среде cursor.fetchone()[0] возвращается json ( dict ).

Ответ №1:

У меня тоже было нечто подобное. Мой sql возвращал json. Django в моей среде разработки превращал json в словарь, содержащий список списков, но django в рабочей среде возвращал словарь, содержащий список строк.

Проблема, с которой я столкнулся, заключалась в разных версиях psycopg2. Я использовал 2.5 в разработке, но 2.4 в производстве.

Проверьте все свои пакеты, чтобы убедиться, что ваша среда разработки совпадает с вашей производственной средой.