2011-10-10 37 views
8

我想要得到這樣一個JSON對象來模擬類JSON使用Django

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

於是,我就用simplejson和一個方法稱爲jsonToClass()

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

這是行不通的。什麼是最簡單的方法來做我想要的?

回答

10

你可能想看看Django的(de)serialization framework。鑑於JSON,如:

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

,你可以將它保存這樣的:

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

請注意,我認爲你必須使用Django的序列化格式,使用這種方法,所以你可能需要調整您的JSON因此。

+0

那麼,你可以使用'json'模塊將響應包裝在序列化模塊所需的外部數組和對象中。但是這可能是矯枉過正。 – nrabinowitz

+0

感謝@nrabinowitz,我要讀取反序列化框架,但我需要通過http請求獲取這個json對象,並且沒有標準的 ,因爲有時我使用graph.facebook.com獲取數據,另一個YouTube的API。 – cleliodpaula

+1

我還應該指出,在您的原始代碼中,json.dumps()應該是json.loads(s) - 這可能是原始代碼無法工作的原因。 – nrabinowitz

4

我剛剛意識到

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

是一個字典()對象。

所以,這比我想象的要簡單。

我需要解決的是剛剛

def jsonToClass(self, aux): 

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

就是這樣。

+0

有點危險,但也許可以(有時)可能應該做一些檢查,而不是'self .__ dict __。update(aux)' – user25064

+0

這是如何危險的?是否因爲如果數據未被檢查,它可能會得到重複的鍵(並覆蓋不同的值)? – Kreychek

+0

因爲您可以在模型上具有Python屬性的字段,並由複雜的setter守護。否則,根本沒有類型檢查或驗證 - 但是如果您信任您的數據,那可能會起作用 – jsbueno