将Django queryset输出为JSON [英] Output Django queryset as JSON
问题描述
我想序列化我的查询集,并希望它以该视图输出的格式:
I want to serialize my queryset, and I want it in a format as this view outputs:
class JSONListView(ListView):
queryset = Users.objects.all()
def get(self, request, *args, **kwargs):
return HttpResponse(json.dumps({'data': [['bar','foo','bar','foo'],['foo','bar','foo','bar']]}, indent=4), content_type='application/json')
我只是不知道如何输出查询集而不是示例中的手动数据.
I simply don't know how to output the queryset instead of the manual data in the example.
我尝试过
json.dumps({"data": self.get_queryset()})
和
serializers.serialize("json", {'data': self.get_queryset()})
但是它行不通.我究竟做错了什么?我需要制作自定义JSON编码器吗?
but it wont work. What am I doing wrong? Do I need to make a custom JSON Encoder?
推荐答案
您可以使用 JsonResponse 与值.简单的例子:
You can use JsonResponse with values. Simple example:
from django.http import JsonResponse
def some_view(request):
data = list(SomeModel.objects.values())
return JsonResponse(data, safe=False) # or JsonResponse({'data': data})
使用 Django内置的序列化程序的另一种方法:
from django.core import serializers
from django.http import HttpResponse
def some_view(request):
qs = SomeModel.objects.all()
qs_json = serializers.serialize('json', qs)
return HttpResponse(qs_json, content_type='application/json')
在这种情况下,响应会有所不同(默认情况下没有缩进):
In this case response will be bit different (without indent by default):
[
{
"model": "some_app.some_model",
"pk": 1,
"fields": {
"name": "Ivan",
"age": 35,
...
}
},
...
]
我必须说,使用棉花糖之类的东西来序列化查询集是一种好习惯.
I must say that it is good practice to use something like marshmallow to serialize queryset.
...以及一些注意事项,以提高性能:
...and a few notes for better performance:
- 如果您的查询集很大,请使用分页;
- 使用
objects.values()
指定必需字段的列表,以避免序列化并将不必要的模型字段发送给客户端(您也可以将fields
传递给serializers.serialize
);
- use pagination if your queryset is big;
- use
objects.values()
to specify list of required fields to avoid serialization and sending to client unnecessary model's fields (you also can passfields
toserializers.serialize
);
这篇关于将Django queryset输出为JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!