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)