Converti un QuerySet in un JSON in Django

Vaibhav Vaibhav 29 giugno 2021
  1. Converti un QuerySet in un JSON usando un metodo personalizzato
  2. Converti un QuerySet in un JSON utilizzando i serializzatori integrati di Django
  3. Converti un QuerySet in un JSON usando la funzione values()
Converti un QuerySet in un JSON in Django

In Django, tutti i gestori di modelli restituiscono un QuerySet quando una query viene applicata su un modello. Un QuerySet può essere facilmente utilizzato nel linguaggio di template di Python e Django. Possiamo eseguire molte azioni su un QuerySet per recuperare i risultati oi record desiderati. Ma un QuerySet ha uno svantaggio: non sono serializzabili JSON.

Oltre alle applicazioni Web, Django viene utilizzato anche per creare API e nelle API JSON è essenziale perché i dati viaggiano in un formato JSON tra il server e il client.

Sebbene non sia direttamente possibile convertire un QuerySet in JSON, possiamo utilizzare un QuerySet per creare un oggetto Python o un JSON stringato. Ci sono un paio di modi per raggiungerlo. Questo articolo discuterà alcuni modi migliori per convertire un QuerySet in un JSON.

Converti un QuerySet in un JSON usando un metodo personalizzato

Supponiamo di avere un modello Django come segue. Possiamo scrivere una funzione che accetterà un oggetto di questo modello e restituirà una rappresentazione del dizionario dell’oggetto.

from django.db import models


class Person(models.Model):
    username = models.CharField(max_length=200, unique=True)
    firstName = models.CharField(max_length=200)
    middleName = models.CharField(max_length=200)
    lastName = models.CharField(max_length=200)
    age = models.IntegerField(default=0)

E il metodo per gestire la conversione è il seguente.

def personToDictionary(person):
    if person == None:
        return None

    dictionary = {}
    dictionary["username"] = person.username
    dictionary["firstName"] = person.firstName
    dictionary["middleName"] = person.middleName
    dictionary["lastName"] = person.lastName
    dictionary["age"] = person.age

    return dictionary


person = Person.objects.get(id=25)
personDictionary = personToDictionary(person)

Questo approccio ci offre un maggiore controllo sui dati che desideriamo includere nella rappresentazione del dizionario. Ad esempio, se avessimo chiavi esterne, potremmo includere varie informazioni sui modelli di riferimento. Possiamo anche eseguire alcuni calcoli e includerli nel dizionario.

Converti un QuerySet in un JSON utilizzando i serializzatori integrati di Django

Django ha serializzatori integrati che possono essere utilizzati per convertire i modelli nella forma desiderata. È possibile trasformare un modello in un formato JSON, XML, JSONL e YAML utilizzando i serializzatori. Alcuni formati richiedono alcune librerie Python aggiuntive per funzionare.

Supponiamo di dover convertire il modello Person sopra in un formato JSON. Per fare ciò, faremmo quanto segue.

from django.core import serializers

person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())

Un serializzatore può convertire un singolo modello e un QuerySet. La variabile person e people conterranno ora i dati in un formato JSON.

Diciamo che dobbiamo convertire solo i campi del nome del modello. Per ottenere ciò, faremmo quanto segue.

from django.core import serializers

person = serializers.serialize(
    "json", Person.objects.get(id=25), fields=("firstName", "middleName", "lastName")
)
people = serializers.serialize(
    "json", Person.objects.all(), fields=("firstName", "middleName", "lastName")
)

Dobbiamo impostare il parametro fields su una tupla di nomi di campo del modello. Un punto chiave da notare qui è che la chiave primaria, l’id, è sempre serializzata, che tu la menzioni o meno.

Per saperne di più sui serializzatori, fare riferimento alla documentazione ufficiale di Django qui.

Converti un QuerySet in un JSON usando la funzione values()

Il terzo approccio utilizza il metodo values() che può essere chiamato su un QuerySet. Un QuerySet restituisce un insieme di istanze del modello, mentre il metodo values() restituisce un insieme di dizionari che rappresentano le istanze del modello.

Fare riferimento al codice seguente.

person = Person.objects.filter(age=25).values()
people = Person.objects.all().values()

Per impostazione predefinita, un dizionario contiene tutti i campi della tabella. Se dobbiamo limitare i campi, possiamo utilizzare gli argomenti posizionali opzionali, *fields, in questo metodo. Fare riferimento al seguente frammento di codice.

person = Person.objects.filter(age=25).values("id", "age", "firstName", "lastName")
people = Person.objects.all().values("id", "firstName")
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.