django:如何从json数据更新模型字段

时间:2014-02-15 12:16:55

标签: json django-models

我有json数据,如:

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

我为模型 Geek 定义了一个自定义方法,以便从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

现在我想更新现有的模型实例 比方说,我跟随模型实例 id = 1

的json数据
{
"lastname": "kumar"
}


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

现在,如果没有明确使用fieldname(lastname),我该如何做。

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

1 个答案:

答案 0 :(得分:10)

如果您要将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