Django에서 JSON 응답 생성
-
Django의 In-Build 클래스
JsonResponse
를 사용하여 JSON 응답 생성 -
QuerySet
를 Python 사전으로 변환하고 JSON 응답 생성 -
Django의 In-Build 클래스
HttpResponse
를 사용하여 JSON 응답 생성
API 또는 일반적으로 작업 할 때 때때로 JSON (JavaScript Object Notation) 형식으로 서버에서 클라이언트로 데이터를 보내야합니다. 특히 API에서 JSON은 데이터를 보내거나 검색하는 필수 형식입니다.
Django에서 JSON Response로 작업하는 것은 비교적 쉽습니다. 실제로 JSON 응답을 생성 할 수있는 두 가지 방법이 있습니다.
Django의 In-Build 클래스JsonResponse
를 사용하여 JSON 응답 생성
이름에서 알 수 있듯이JsonResponse
는 JSON 응답을 만드는 데 사용됩니다. 이 클래스의 생성자는 Python 사전을 매개 변수로 받아들이고 해당 사전을 기반으로 JSON 응답을 생성합니다.
가능한 가장 간단한 예는 다음과 같습니다.
from django.views import View
from django.http import JsonResponse
# Function based view
def myView(request):
data = {
"name": "Vaibhav",
"age": 20,
"hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
}
return JsonResponse(data)
# Class based view
class MyView(View):
def get(self, request):
data = {
"name": "Vaibhav",
"age": 20,
"hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
}
return JsonResponse(data)
그러나 모든 반짝이가 금은 아닙니다. JsonResponse
는QuerySet
또는 Django 모델을 처리 할 때 오류를 발생시킵니다.
QuerySet
은 Python 사전이 아닙니다. JSON 응답에서QuerySet
또는 Django 모델을 보내거나 공유해야하는 경우 Python 사전으로 변환해야합니다.
이제 우리가 이것을 할 수있는 두 가지 방법이 있습니다. 먼저 Django 모델 또는QuerySet
배열을 받아들이고이를 Python 사전 또는 Python 사전 배열로 변환하는 함수를 만듭니다. 두 번째 옵션은 Django serializer를 사용하는 것입니다. 이 튜토리얼은 시리얼 라이저 자체가 큰 주제이기 때문에 커스텀 함수에 대해서만 설명합니다.
원하는 경우 여기에서 serializer에 대해 알아볼 수 있습니다.
QuerySet
를 Python 사전으로 변환하고 JSON 응답 생성
설명을 위해 간단한 Django 모델을 고려하고 이러한 모델을 JSON 응답과 공유하는 방법을 배웁니다.
다음 모델을 고려하십시오.
from django.db import models
from django.contrib.auth.models import User
class Blog(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blogs")
title = models.CharField(max_length=250)
description = models.CharField(max_length=500)
showcaseImage = models.ImageField(upload_to="Images/")
dateTimeOfCreation = models.DateTimeField(auto_now=True)
shareURL = models.URLField()
likes = models.IntegerField()
disLikes = models.IntegerField()
bookmarks = models.IntegerField()
def __str__(self):
return self.title
이 모델을 Python 사전으로 변환하고 JSON 응답으로 보내야하는 경우 변환을 처리하는 유틸리티 함수를 만들 수 있습니다. 그런 다음 뷰 내에서 사전을 만들고 변환 된 Python 사전에 대한 키-값 쌍을 추가 한 다음JsonResponse
를 만들 수 있습니다.
다음 코드를 참조하십시오.
from django.views import View
from django.http import JsonResponse
from . import models
def blogToDictionary(blog):
"""
A utility function to convert object of type Blog to a Python Dictionary
"""
output = {}
output["title"] = blog.title
output["description"] = blog.description
output["showcaseImage"] = blog.showcaseImage.url
output["dateTimeOfCreation"] = blog.dateTimeOfCreation.strftime(
"%m/%d/%Y, %H:%M:%S"
)
output["shareURL"] = blog.shareURL
output["likes"] = blog.likes
output["disLikes"] = blog.disLikes
output["bookmarks"] = blog.bookmarks
return output
# Function based view
def myView(request):
# Single Blog
blog = models.Blog.objects.get(id=1)
# Multiple Blogs
blogs = models.Blog.objects.all()
tempBlogs = []
# Converting `QuerySet` to a Python Dictionary
blog = blogToDictionary(blog)
for i in range(len(blogs)):
tempBlogs.append(
blogToDictionary(blogs[i])
) # Converting `QuerySet` to a Python Dictionary
blogs = tempBlogs
data = {"blog": blog, "blogs": blogs}
return JsonResponse(data)
위 코드에서Blog
유형의 객체 변환을 처리하는 유틸리티 함수blogToDictionary()
를 만들었습니다. 이 함수는 모든 필드를 반복하고 사전에 저장 한 다음 마지막으로 사전을 반환합니다. 그런 다음 뷰 내에서 가져온 객체를 변환하고JsonResponse
를 생성했습니다.
Django의 In-Build 클래스HttpResponse
를 사용하여 JSON 응답 생성
HttpResponse
를 사용하여 JSON 응답을 생성 할 수도 있습니다. 절차는 거의 동일합니다. 먼저 보내려는 데이터의 사전을 만듭니다. 그런 다음HttpResponse
객체를 만듭니다. content_type
을application/json
으로 설정하고 Python의 빌드 내 라이브러리json
을 사용하여 Python 사전을 JSON으로 변환합니다. 마지막으로 변환 된 사전을HttpResponse
와 함께 보냅니다.
import json
from django.views import View
from django.http import JsonResponse
# Function based view
def myView(request):
data = {
"name": "Vaibhav",
"age": 20,
"hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
}
return HttpResponse(json.dumps(data), content_type="application/json")
# Class based view
class MyView(View):
def get(self, request):
data = {
"name": "Vaibhav",
"age": 20,
"hobbies": ["Coding", "Art", "Gaming", "Cricket", "Piano"],
}
return HttpResponse(json.dumps(data), content_type="application/json")
위에서 언급했듯이QuerySet
또는 Django 모델은이 메서드를 사용하여 보내기 전에 Python 사전으로 변환해야합니다.