2011-10-10 13 views
8

Sto cercando di ottenere un oggetto JSON come:JSON per modellare una classe utilizzando Django

{ 
    "username": "clelio", 
    "name": "Clelio de Paula", 
} 

e trasformarlo in:

class User(models.Model): 

    name = models.CharField(max_length=30) 
    username = models.CharField(max_length=20) 

    def jsonToClass(s): 

     aux = json.dumps(s, self) 

     self.name = aux['name'] 
     self.id = aux['id'] 

Così ho provato a utilizzare il metodo simplejson e uno chiamato jsonToClass():

>>> import simplejson as json 
    >>> u1 = User() 
    >>> u1.jsonToClass(face) 
    >>> u1.save() 

Questo non funziona. Qual è il metodo più semplice per fare ciò che voglio?

risposta

10

Probabilmente vorrete dare un'occhiata a (de)serialization framework di Django. Dato JSON come:

[ 
    { 
    "model": "myapp.user", 
    "pk": "89900", 
    "fields": { 
     "name": "Clelio de Paula" 
    } 
    } 
] 

è possibile salvare in questo modo:

from django.core import serializers 
for deserialized_object in serializers.deserialize("json", data): 
    deserialized_object.save() 

Nota che credo si deve utilizzare il formato di serializzazione Django per utilizzare questo metodo, per cui si potrebbe modificare il tuo JSON di conseguenza.

+0

Bene, è possibile utilizzare il modulo 'json' per avvolgere la risposta nell'array esterno e nell'oggetto richiesto dal modulo di serializzazione. Ma potrebbe essere eccessivo. – nrabinowitz

+0

Grazie a @nrabinowitz, ho intenzione di leggere il framework di deserializzazione, ma ho bisogno di ottenere questi oggetti json per richiesta http e non ho uno standard perché a volte sto ricevendo dati usando graph.facebook.com e un'altra youtube api. – cleliodpaula

+1

Dovrei anche far notare che nel tuo codice originale, json.dumps() dovrebbe essere json.loads (s) - questo è probabilmente il motivo per cui il codice originale non ha funzionato. – nrabinowitz

4

Ho appena realizzato che

{ 
    "username": "clelio", 
    "name": "Clelio de Paula", 
} 

è un oggetto dict().

Quindi, questo è più facile di quanto pensassi.

Che cosa ho bisogno per risolvere è solo

def jsonToClass(self, aux): 

    self.name = aux['name'] 
    self.username = aux['username'] 

il gioco è fatto.

+0

un po 'pericoloso ma forse ok (a volte) probabilmente dovrebbe fare alcuni controlli e quant'altro 'self .__ dict __. Update (aux)' – user25064

+0

Com'è pericoloso? È perché potrebbe ottenere chiavi duplicate (e sovrascrivere valori distinti) se i dati non sono controllati? – Kreychek

+0

Poiché è possibile avere campi sul modello che sono proprietà Python e protetti da setter complessi. In caso contrario, non vi è alcun tipo di verifica o convalida, ma se si ha fiducia nei propri dati, potrebbe funzionare – jsbueno

Problemi correlati