2014-02-15 59 views
4

我有這樣的json數據:Django的:如何從JSON數據更新模型場

{ 
"firstname": "nav", 
"lastname": "yad", 
"age": 22 
} 

我已經定義了一個自定義的方法模型野人從JSON對象保存。

def jsonToModel(self, jsonObj): 
    data = json.loads(jsonObj) 
    self.firstname = data['firstname'] 
    self.lastname = data['lastname'] 
    self.age = data['age'] 

節省JSON對象像模型:

>> obj = Geek() 
>> obj.jsonToModel(jsondata) 
>>obj.save 

現在我想更新現有的模型實例 說,我有以下的JSON數據模型實例ID = 1

{ 
"lastname": "kumar" 
} 


>> ob = Geek.objects.get(id=1) 

現在我怎麼能像下面一樣通過不明確使用字段名 (姓)。

>> ob.*field* = *data_for_field* 
>> ob.save() 

回答

9

如果你將要轉向JSON數據轉換成模型在您的應用程序,很可能會更好地使用現有的解決方案之一,此如美妙Django REST Framework。它很像提交Django表單,並且會提供很多重要的安全性和清理樣板。

如果您決定推出自己的實施,您可以使用setattr()。這將允許您設置您的模型中的任意屬性,所以你可以做到以下幾點:

json_data = {"lastname":"kumar"} 

ob = Geek.objects.get(id=1) 
for key, value in json_data.items(): 
    setattr(ob, key, value) 
ob.save() 

然而,這是一個有點危險,因爲這將允許任意鍵被設定爲一個屬性你的對象。爲了避免這種情況,你可以做的另一種方法對你Geek型號:

def update_field(self, key, value): 
    # This will raise an AttributeError if the key isn't an attribute 
    # of your model 
    getattr(self, key) 
    setattr(self, key, value) 

那麼你可以使用:

json_data = {"lastname":"kumar"} 

ob = Geek.objects.get(id=1) 
for key, value in json_data.items(): 
    ob.update_field(key, value) 
ob.save(update_fields=json_data.keys()) # This will only save the updated keys