将 Django 查询集输出为 JSON [英] Output Django queryset as JSON

查看:32
本文介绍了将 Django 查询集输出为 JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想序列化我的查询集,并且我希望它采用此视图输出的格式:

class JSONListView(ListView):查询集 = 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')

我只是不知道如何输出查询集而不是示例中的手动数据.

我试过了

json.dumps({"data": self.get_queryset()})

serializers.serialize("json", {'data': self.get_queryset()})

但它不会工作.我究竟做错了什么?我需要制作自定义 JSON 编码器吗?

解决方案

您可以使用 JsonResponse.简单例子:

from django.http import JsonResponsedef some_view(请求):data = list(SomeModel.objects.values()) # 包裹在 list() 中,因为 QuerySet 不是 JSON 可序列化的return JsonResponse(data, safe=False) # 或 JsonResponse({'data': data})

或者使用 Django 的内置序列化程序的另一种方法:

from django.core 导入序列化程序从 django.http 导入 HttpResponsedef some_view(请求):qs = SomeModel.objects.all()qs_json = serializers.serialize('json', qs)返回 HttpResponse(qs_json, content_type='application/json')

在这种情况下,结果略有不同(默认不缩进):

<预><代码>[{"model": "some_app.some_model",PK":1,领域":{"name": "埃隆",年龄":48,...}},...]

我不得不说,使用 marshmallow 之类的东西来序列化查询集是一种很好的做法.

...以及一些提高性能的注意事项:

  • 如果您的查询集很大,请使用分页;
  • 使用 objects.values() 指定必填字段列表以避免序列化和发送到客户端不必要的模型字段(您也可以将 fields 传递给 serializers.序列化);

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.

I've tried

json.dumps({"data": self.get_queryset()})

and

serializers.serialize("json", {'data': self.get_queryset()})

but it wont work. What am I doing wrong? Do I need to make a custom JSON Encoder?

解决方案

You can use JsonResponse with values. Simple example:

from django.http import JsonResponse

def some_view(request):
    data = list(SomeModel.objects.values())  # wrap in list(), because QuerySet is not JSON serializable
    return JsonResponse(data, safe=False)  # or JsonResponse({'data': data})

Or another approach with Django's built-in serializers:

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 result is slightly different (without indent by default):

[
    {
        "model": "some_app.some_model",
        "pk": 1,
        "fields": {
            "name": "Elon",
            "age": 48,
            ...
        }
    },
    ...
]

I have to say, it is good practice to use something like marshmallow to serialize queryset.

...and a few notes for better performance:

  • 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 pass fields to serializers.serialize);

这篇关于将 Django 查询集输出为 JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆