Django에서 JSON 응답 생성

Vaibhav Vaibhav 2023년1월30일
  1. Django의 In-Build 클래스JsonResponse를 사용하여 JSON 응답 생성
  2. QuerySet를 Python 사전으로 변환하고 JSON 응답 생성
  3. Django의 In-Build 클래스HttpResponse를 사용하여 JSON 응답 생성
Django에서 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)

그러나 모든 반짝이가 금은 아닙니다. JsonResponseQuerySet또는 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_typeapplication/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 사전으로 변환해야합니다.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

관련 문장 - Django JSON