Django View: возвращать набор запросов в формате JSON - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь заставить работать следующее представление с return JsonResponse() в конце правильно:

def get_data(request):
    full_data = Fund.objects.all()
    data = {
    "test2": full_data.values('investment_strategy').annotate(sum=Sum('commitment')),
    }
    return JsonResponse(data)

Тем не менее, я получаю сообщение об ошибке «Объект типа QuerySet не сериализуем в JSON».Когда я помещаю вышеупомянутый набор запросов в представление с return render() в конце:

def get_more_data(request):
    full_data = Fund.objects.all()
    data = {"test2": full_data.values('investment_strategy').annotate(sum=Sum('commitment'))}
    return render (request, 'test.html', data)

, я получаю следующий результат: <QuerySet [{'investment_strategy': 'Buyout', 'sum': 29}, {'investment_strategy': 'Growth', 'sum': 13}, {'investment_strategy': 'Miscellaneous', 'sum': 14}, {'investment_strategy': 'Venture Capital', 'sum': 23}, {'investment_strategy': 'n/a', 'sum': 36}]>

Так что набор запросов работает нормально, я простоПонятия не имею, как вернуть данные в правильном формате Json (который мне нужно будет использовать data charts.js)

Я просмотрел ответы на похожие вопросы, такие как: TypeError: объект не является JSONСериализуем в DJango 1.8 Python 3.4 Выведите набор запросов Django как JSON и т. д., но не смог найти значимого решения для моей проблемы.

Любая помощь будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Так что мне удалось найти решение, которое сработало для меня - на случай, если у кого-то еще возникнет такая же проблема.Я изменил свое представление на следующее:

def get_data(request):
    full_data = Fund.objects.all()
    full_data_filtered = full_data.values('investment_strategy').annotate(sum=Sum('commitment'))

labels = []
values = []

for d in full_data_filtered:
    labels.append(d['investment_strategy'])
    values.append(d['sum'])

data = {
    "labels": labels,    
    "values": values,
    }

return JsonResponse(data)

Таким образом, в основном я перебираю Queryset и назначаю значения, которые мне нужны, спискам, которые можно передать в JsonResponse.Я не знаю, если это самый элегантный способ сделать это (конечно, нет), но он работает, и я могу отрисовать свои данные в charts.js

0 голосов
/ 20 сентября 2019

JsonResponse(list(data)) оценит Queryset (фактически выполнит запрос к базе данных) и превратит его в список, который может быть передан JsonResponse.

Это работает, потому что вы используете values и annotate, поэтому список представляет собой список словарей, содержащих сериализуемые поля.

В упомянутом вами примере это не сработало, потому чтоQueryset только что возвращал список экземпляров модели, поэтому перенос в list() недостаточен.Если бы вы не добавили values, у вас был бы список Fund экземпляров, которые нельзя сериализовать.

...