<p>可以将<a href="https://docs.djangoproject.com/en/2.0/ref/request-response/#jsonresponse-objects" rel="nofollow noreferrer">JsonResponse</a>与<a href="https://docs.djangoproject.com/en/2.0/ref/models/querysets/#django.db.models.query.QuerySet.values" rel="nofollow noreferrer">values</a>一起使用。简单示例:</p>
<pre><code>from django.http import JsonResponse
def some_view(request):
data = list(SomeModel.objects.values()) # use list(), because QuerySet is not JSON serializable
return JsonResponse(data, safe=False) # or JsonResponse({'data': data})
</code></pre>
<p>或者使用<a href="https://docs.djangoproject.com/en/2.0/topics/serialization/" rel="nofollow noreferrer">Django's built-in serializers</a>的另一种方法:</p>
<pre><code>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')
</code></pre>
<p>在这种情况下,结果略有不同(默认情况下没有缩进):</p>
<pre><code>[
{
"model": "some_app.some_model",
"pk": 1,
"fields": {
"name": "Ivan",
"age": 35,
...
}
},
...
]
</code></pre>
<p>我不得不说,使用<a href="https://marshmallow.readthedocs.io/" rel="nofollow noreferrer">marshmallow</a>之类的东西序列化queryset是一个很好的实践。</p>
<p>…以及一些提高性能的注意事项:</p>
<ul>
<li>如果查询集很大,请使用分页</li>
<li>使用<code>objects.values()</code>指定所需字段的列表,以避免序列化并发送给客户端不必要的模型字段(您还可以将<code>fields</code>传递给<code>serializers.serialize</code>)</li>
</ul>