Crea una risposta JSON in Django

Vaibhav Vaibhav 29 giugno 2021
  1. Crea una risposta JSON utilizzando la classe In-Build di Django JsonResponse
  2. Converti QuerySet in un dizionario Python e crea una risposta JSON
  3. Crea una risposta JSON utilizzando la classe In-Build di Django HttpResponse
Crea una risposta JSON in Django

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.

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.