2011-10-10 29 views
8

Próbuję uzyskać obiekt JSON jak:JSON do modelu klasy przy użyciu Django

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

i przekształcić go w:

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'] 

Więc próbowałem użyć metody simplejson i jeden o nazwie jsonToClass():

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

To nie działa. Jaka jest najłatwiejsza metoda robienia tego, co chcę?

Odpowiedz

10

Prawdopodobnie chcesz obejrzeć Django na (de)serialization framework. Biorąc pod uwagę, JSON jak:

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

można zapisać tak:

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

Zauważ, że wierzę, trzeba użyć formatu serializacji Django użyć tej metody, więc może być dostosowanie JSON odpowiednio.

+0

Cóż, możesz użyć modułu 'json' do zawarcia odpowiedzi w zewnętrznej tablicy i obiekcie wymaganym przez moduł serializacji. Ale to może być przesada. – nrabinowitz

+0

Dzięki @nrabinowitz, mam zamiar przeczytać strukturę deserializacji, ale muszę uzyskać te obiekty Json przez żądanie http i nie mam standardowego ponieważ czasami dostaję dane za pomocą graph.facebook.com i kolejne api youtube. – cleliodpaula

+1

Należy również zwrócić uwagę, że w oryginalnym kodzie, json.dumps() powinno być json.loads (s) - prawdopodobnie dlatego oryginalny kod nie działał. – nrabinowitz

4

zdałem sobie sprawę, że

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

jest dict() obiektu.

To jest najłatwiejsze, niż myślałem.

Co muszę rozwiązać tylko

def jsonToClass(self, aux): 

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

to wszystko.

+0

jest nieco niebezpieczny, ale może w porządku (czasami) prawdopodobnie powinien zrobić kilka sprawdzeń, a co innego "ja .__ dict __. Update (aux)' – user25064

+0

Jak to jest niebezpieczne? Czy to dlatego, że może uzyskać duplikaty kluczy (i zastąpić różne wartości), jeśli dane nie są sprawdzane? – Kreychek

+0

Ponieważ możesz mieć pola w swoim modelu, które są właściwościami Pythona i są chronione przez złożone narzędzia ustawiające. W przeciwnym razie nie ma żadnego sprawdzania typu ani sprawdzania poprawności - ale jeśli ufasz swoim danym, może to zadziałać – jsbueno

Powiązane problemy