DRF (Django Rest Framework)是基于Django的RESTful框架,它提供了一系列用于構(gòu)建Web API的常用工具和庫(kù),讓我們能夠快速地構(gòu)建高質(zhì)量的API服務(wù)。在使用DRF時(shí)候,有時(shí)候需要給前端返回兩個(gè)json,本文將介紹如何進(jìn)行操作。
首先,我們需要定義視圖View,這里我們以Class-Based-Views(CBV)為例。在視圖方法中,可以使用HttpResponse將處理好的數(shù)據(jù)返回給前端,如下所示:
from django.http import HttpResponse
class ReturnTwoJSONView(APIView):
def get(self, request, pk):
data1 = Model1.objects.filter(id=pk).values()
data2 = Model2.objects.filter(model1_id=pk).values()
return HttpResponse({
'data1': data1,
'data2': data2
})
在上述代碼中,我們通過Model1和Model2分別獲取了數(shù)據(jù)data1和data2,并將它們打包在一個(gè)HttpResponse對(duì)象中返回。這種方法對(duì)于數(shù)據(jù)量比較小的情況下,速度相對(duì)較快,而且代碼量也比較容易理解。
然而,當(dāng)需要處理的數(shù)據(jù)量較大時(shí),使用HttpResponse來(lái)進(jìn)行返回?cái)?shù)據(jù)就不太合適了。這時(shí),我們可以使用StreamingHttpResponse來(lái)進(jìn)行數(shù)據(jù)分批返回,以提高數(shù)據(jù)處理效率。
from django.http import StreamingHttpResponse
class ReturnTwoJSONView(APIView):
def get(self, request, pk):
data1 = Model1.objects.filter(id=pk).values()
data2 = Model2.objects.filter(model1_id=pk).values()
def return_data():
yield '{'
yield '"data1":'
for data in data1:
yield f'{data},'
yield '"data2":'
for data in data2:
yield f'{data},'
yield '}'
response = StreamingHttpResponse(
streaming_content=return_data(),
content_type='application/json',
)
response['Content-Disposition'] = 'attachment; filename="two_data.json"'
return response
在上述代碼中,我們使用了yield來(lái)拆分返回?cái)?shù)據(jù),這樣當(dāng)數(shù)據(jù)量比較大時(shí)就可以進(jìn)行分批處理,提高數(shù)據(jù)處理效率。然后我們使用StreamingHttpResponse將處理好的數(shù)據(jù)返回給前端。此時(shí),需要設(shè)置content_type為'application/json',告訴瀏覽器返回的是JSON數(shù)據(jù)。最后,設(shè)置Content-Disposition讓瀏覽器把應(yīng)答體封裝成一個(gè)文件并下載到本地。
總的來(lái)說(shuō),通過HttpResponse和StreamingHttpResponse方法都可以給前端返回兩個(gè)JSON數(shù)據(jù),根據(jù)自己的業(yè)務(wù)場(chǎng)景及數(shù)據(jù)處理量選擇合適的返回方法即可。