2011-10-10 36 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