Django视图:返回JSON格式的Queryset

Django视图:返回JSON格式的Queryset,json,django,django-views,django-queryset,Json,Django,Django Views,Django Queryset,我试图在最后使用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) 但是,我收到一条错误消息,说“Q

我试图在最后使用
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工作正常,我只是不知道如何以正确的Json格式返回数据(我需要使用datacharts.js)

我查看了类似问题的答案,例如: 等 但却找不到解决我问题的有意义的方法

任何帮助都将不胜感激

JsonResponse(list(data))
将评估查询集(实际执行对数据库的查询),并将其转换为可传递给
JsonResponse
的列表

这是因为您使用了
注释
,所以列表是包含可序列化字段的词典列表


在您提到的示例中,它不起作用,因为Queryset只是返回一个模型实例列表,所以在
list()
中包装是不够的。如果您没有添加
,您将拥有一个不可序列化的
基金
实例列表。

因此我设法找到了一个解决方案,它对我有效-以防其他人也有同样的问题。我将我的观点改为:

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。我不知道这是否是最优雅的方法(当然不是),但它可以工作,而且我可以在图表中呈现数据。js我发现最好的方法是创建一个自定义查询集和管理器,它不需要太多代码,而且是可重用的

我首先创建了:

然后我创建了一个,它是,但我更喜欢这种方式

# managers.py, also optional
class DictManager(models.Manager):

    def get_queryset(self):
        return DictQuerySet(self.model, using=self._db)
更改模型中的默认管理器:

# models.py
from .managers import DictManager

class Fund(models.Model):
    # ...
    objects =  DictManager()
    # ...
现在可以从查询中调用dict()方法

# views.py 

def get_data(request):
    full_data = Fund.objects.all().dict()
    return JsonResponse(full_data)
响应将是
full_data
,作为字典字典,每个键都是相应对象的主键

如果您打算为JSON保留相同的格式,那么您可以对所有模型使用相同的自定义管理器。

JsonResponse(list(data))
将评估查询集(实际执行对数据库的查询),并将其转换为可传递给
JsonResponse
的列表。这是因为您使用了
注释
,所以列表是包含可序列化字段的词典列表。
# views.py 

def get_data(request):
    full_data = Fund.objects.all().dict()
    return JsonResponse(full_data)