Erstellen Sie eine JSON-Antwort in Django

Erstellen Sie eine JSON-Antwort in Django

Vaibhav Vaibhav Oct-19, 2021 Jun-29, 2021 Django Django JSON
  1. Erstellen Sie eine JSON-Antwort mit der In-Build-Klasse JsonResponse von Django
  2. Konvertieren Sie QuerySet in ein Python-Dictionary und erstellen Sie eine JSON-Antwort
  3. Erstellen Sie eine JSON-Antwort mit der In-Build-Klasse HttpResponse von Django

Bei der Arbeit mit APIs oder allgemein müssen wir manchmal Daten in Form von JSON (JavaScript Object Notation) vom Server an den Client senden. Gerade bei APIs ist JSON eine Pflichtform, in der Daten versendet oder abgerufen werden.

In Django ist die Arbeit mit JSON-Antworten relativ einfach. Es gibt eigentlich zwei Möglichkeiten, wie wir JSON-Antworten erstellen können.

Erstellen Sie eine JSON-Antwort mit der In-Build-Klasse JsonResponse von Django

JsonResponse wird, wie der Name schon sagt, verwendet, um eine JSON-Antwort zu erstellen. Der Konstruktor dieser Klasse akzeptiert ein Python-Dictionary als Parameter und erstellt eine JSON-Antwort basierend auf diesem Dictionary.

Das einfachste mögliche Beispiel ist wie folgt.

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)

Aber nicht alles Glitzer ist Gold. JsonResponse gibt beim Umgang mit einem QuerySet oder einem beliebigen Django-Modell einen Fehler aus.

QuerySet ist kein Python-Dictionary. Wenn wir ein QuerySet oder ein Django-Modell in einer JSON-Antwort senden oder freigeben müssen, muss es in ein Python-Dictionary konvertiert werden.

Nun gibt es zwei Möglichkeiten, wie wir dies tun können. Erstellen Sie zunächst eine Funktion, die ein Django-Modell oder ein Array von QuerySet akzeptiert und in ein Python-Dictionary oder ein Array von Python-Dictionaries umwandelt. Die zweite Möglichkeit besteht darin, Django-Serializer zu verwenden. In diesem Tutorial wird nur über die benutzerdefinierte Funktion gesprochen, da Serializer selbst ein großes Thema sind.

Wenn Sie möchten, können Sie sich hier über Serializer informieren.

Konvertieren Sie QuerySet in ein Python-Dictionary und erstellen Sie eine JSON-Antwort

Zur Erläuterung betrachten wir ein einfaches Django-Modell und lernen, wie Sie ein solches Modell mit einer JSON-Antwort teilen.

Betrachten Sie das folgende Modell.

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

Wenn wir dieses Modell in ein Python-Dictionary konvertieren und in einer JSON-Antwort senden müssen, können wir eine Dienstprogrammfunktion erstellen, die die Konvertierung durchführt. Dann können wir innerhalb der Ansichten ein Dictionary erstellen und ein Schlüssel-Wert-Paar für das konvertierte Python-Dictionary hinzufügen und dann eine JsonResponse erstellen.

Siehe den folgenden Code.

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)

Im obigen Code haben wir eine Utility-Funktion blogToDictionary() erstellt, die die Konvertierung eines Objekts vom Typ Blog behandelt. Diese Funktion durchläuft alle Felder, speichert sie in einem Dictionary und gibt schließlich das Dictionary zurück. Dann haben wir innerhalb der Ansicht die geholten Objekte konvertiert und eine JsonResponse erstellt.

Erstellen Sie eine JSON-Antwort mit der In-Build-Klasse HttpResponse von Django

Wir können auch mit HttpResponse eine JSON-Antwort erstellen. Das Verfahren ist ziemlich gleich. Wir erstellen zunächst ein Dictionary der Daten, die wir senden möchten. Dann machen wir ein Objekt der Klasse HttpResponse. Wir setzen den content_type auf application/json und konvertieren das Python-Dictionary in JSON mit Pythons eingebauter Bibliothek json. Zuletzt versenden wir das konvertierte Dictionary mit der 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")

Wie oben erwähnt, muss ein QuerySet- oder ein Django-Modell in ein Python-Dictionary konvertiert werden, bevor es mit dieser Methode gesendet wird.

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