我有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()
答案 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