Создайте ответ JSON в Django

Создайте ответ JSON в Django

  1. Создайте ответ JSON с помощью встроенного класса Django JsonResponse
  2. Преобразуйте QuerySet в словарь Python и создайте ответ JSON
  3. Создайте ответ JSON с помощью встроенного класса Django HttpResponse

При работе с API или в целом нам иногда приходится отправлять данные с сервера клиенту в форме JSON (нотация объектов JavaScript). JSON - это обязательная форма, в которой данные отправляются или извлекаются, особенно с API.

В Django работать с ответами JSON относительно просто. На самом деле есть два способа создания ответов JSON.

Создайте ответ JSON с помощью встроенного класса Django JsonResponse

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. Если нам нужно отправить или поделиться моделью QuerySet или Django в ответе JSON, ее необходимо преобразовать в словарь Python.

Есть два способа сделать это. Сначала создайте функцию, которая принимает модель Django или массив QuerySet и преобразует их в словарь Python или массив словарей Python. Второй вариант - использовать сериализаторы Django. В этом руководстве будет рассказано только о пользовательской функции, потому что сериализаторы сами по себе являются большой темой.

Если хотите, вы можете узнать о сериализаторах здесь.

Преобразуйте 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)

В приведенном выше коде мы создали служебную функцию blogToDictionary(), которая обрабатывает преобразование объекта типа Blog. Эта функция выполняет итерацию по всем полям, сохраняет их в словаре и, наконец, возвращает словарь. Затем внутри представления мы преобразовали полученные объекты и создали JsonResponse.

Создайте ответ JSON с помощью встроенного класса Django HttpResponse

Мы также можем создать ответ в формате JSON с помощью HttpResponse. Процедура почти такая же. Сначала мы создаем словарь данных, которые хотим отправить. Затем создаем объект класса 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 перед ее отправкой с помощью этого метода.

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.

LinkedIn GitHub