Converti un QuerySet in un JSON in Django
-
Converti un
QuerySet
in unJSON
usando un metodo personalizzato -
Converti un
QuerySet
in unJSON
utilizzando i serializzatori integrati di Django -
Converti un
QuerySet
in unJSON
usando la funzionevalues()
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")