Erstellen Sie eine JSON-Antwort in Django
-
Erstellen Sie eine JSON-Antwort mit der In-Build-Klasse
JsonResponse
von Django -
Konvertieren Sie
QuerySet
in ein Python-Dictionary und erstellen Sie eine JSON-Antwort -
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.