Django 모델을 Json으로 출력하는 방법

 

Django Restful Framework를 사용하는 경우가 아니라면 프론트엔드와 데이터를 주고 받기 위해 Json Response를 직접 구현하여야 한다. 대부분의 출력은 Django 템플릿 언어(DTL)jinja2를 활용하면 되지만, Javascript 와의 통신과 유동적 프로그래밍을 하기에는 부족하다고 생각한다. Javascript를 HTML 내부에 직접 태깅하여 하드코딩하는 방법도 있는데 아무래도 좋은 코드라 할 수 없다.


HttpResponse vs. JsonResponse

Json을 출력하는 방법에는 크게 두 가지가 있다. HttpResponseJsonResponse다. 이 두 가지의 차이점부터 얘기하고 넘어가도록 하겠다.

우선, JsonResponse는 Automatic Serialize를 지원한다.

return JsonResponse({"key": "value"})

단순하게 위와 같이 사용해도 출력이 된다. Dict타입을 넘겨주면 Json으로 Response해주는 방식이다.

HttpResponse의 기본 header값은 Content-Type: text/html; charset=utf-8 로 되어있다. 아래와 같이 content_type을 설정해줄 수 있다.

return HttpResponse("Text only, please.", content_type="text/plain")

반면에, JsonResponse는 기본 header값이 Content-Type: application/json이다.

솔루션 1: HttpResponse

from django.core import serializers
from django.http import HttpResponse

def view_name(request):
    queryset = SomeModel.objects.all()
    queryset_json = serializers.serialize('json', queryset)
    return HttpResponse(queryset_json, content_type='application/json')

Django에 내장되어있는 serializers 모듈을 사용하여 쿼리셋을 Json으로 Serialize한다. 그리고 위에서 언급했듯이 HttpResponse는 기본적으로 content_typetext/html;로 설정되어 있기 때문에, application/json으로 설정해줘야한다.

솔루션 2: JsonResponse

from django.http import JsonResponse
return JsonResponse({'foo':'bar'})

JsonResponse는 Dict타입의 데이터를 Json으로 응답해준다.

from django.http import JsonResponse

def view_name(request):
data = list(Model.objects.values())
return JsonResponse(data, safe=False)
data = list(Model.objects.values())
Queryset은 Json으로 Serialize할 수 없기때문에 list타입으로 변환해준다.

마치며.

프로젝트를 진행하면서 필요했던 것들에 대한 포스팅을 하는 중이다. 메모가 주 기능이라 생각하지만 다른 개발자들이 좀 더 빠르게 원하는 정보를 얻게 하려는 의도도 있다. Stack Overflow나 외국 문서들을 찾아보는 것은 시간이 많이 소요될 수 있기 때문이다.

이 글의 저작권은 Attribution-NonCommercial 4.0 International 라이센스를 따릅니다. Attribution-NonCommercial 4.0 International