Crea una risposta JSON in Django
-
Crea una risposta JSON utilizzando la classe In-Build di Django
JsonResponse
-
Converti
QuerySet
in un dizionario Python e crea una risposta JSON -
Crea una risposta JSON utilizzando la classe In-Build di Django
HttpResponse
Quando lavoriamo con le API o in generale, a volte dobbiamo inviare dati dal server al client sotto forma di JSON (JavaScript Object Notation). Soprattutto con le API, JSON è un modulo obbligatorio in cui i dati vengono inviati o recuperati.
In Django, lavorare con JSON Responses è relativamente facile. Ci sono in realtà due modi in cui possiamo creare risposte JSON.
Crea una risposta JSON utilizzando la classe In-Build di Django JsonResponse
JsonResponse
, come suggerisce il nome, viene utilizzato per creare una risposta JSON. Il costruttore di questa classe accetta un dizionario Python come parametro e crea una risposta JSON basata su quel dizionario.
L’esempio più semplice possibile è il seguente.
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)
Ma non tutto il luccichio è oro. JsonResponse
genera un errore quando si tratta di un QuerySet
o di qualsiasi modello Django.
QuerySet
non è un dizionario Python. Se dobbiamo inviare o condividere un QuerySet
o un modello Django in una risposta JSON, deve essere convertito in un dizionario Python.
Ora, ci sono due modi in cui possiamo farlo. Innanzitutto, crea una funzione che accetti un modello Django o un array di QuerySet
e li converta in un dizionario Python o in un array di dizionari Python. La seconda opzione è usare i serializzatori Django. Questo tutorial parlerà solo della funzione personalizzata perché i serializzatori sono di per sé un grande argomento.
Se vuoi, puoi conoscere i serializzatori qui.
Converti QuerySet
in un dizionario Python e crea una risposta JSON
Per motivi di spiegazione, prenderemo in considerazione un semplice modello Django e impareremo come condividere tale modello con una risposta JSON.
Considera il seguente modello.
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
Se dobbiamo convertire questo modello in un dizionario Python e inviarlo in una risposta JSON, possiamo creare una funzione di utilità che gestisce la conversione. Quindi all’interno delle viste, possiamo creare un dizionario e aggiungere una coppia chiave-valore per il dizionario Python convertito e quindi creare una JsonResponse
.
Fare riferimento al codice seguente.
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)
Nel codice sopra, abbiamo creato una funzione di utilità blogToDictionary()
che gestisce la conversione di un oggetto di tipo Blog
. Questa funzione esegue un’iterazione su tutti i campi, li memorizza in un dizionario e, infine, restituisce il dizionario. Quindi, all’interno della vista, abbiamo convertito gli oggetti recuperati e creato una JsonResponse
.
Crea una risposta JSON utilizzando la classe In-Build di Django HttpResponse
Possiamo anche creare una risposta JSON usando HttpResponse
. La procedura è più o meno la stessa. Per prima cosa creiamo un dizionario dei dati che desideriamo inviare. Quindi creiamo un oggetto di classe HttpResponse
. Impostiamo content_type
come application/json
e convertiamo il dizionario Python in JSON utilizzando la libreria incorporata di Python json
. Infine, inviamo il dizionario convertito con 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")
Come accennato in precedenza, un modello QuerySet
o Django deve essere convertito in un dizionario Python prima di inviarlo utilizzando questo metodo.