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

nav*_*yad 6 json django-models

我有json数据,如:

{
"firstname": "nav",
"lastname": "yad",
"age": 22
}
Run Code Online (Sandbox Code Playgroud)

我为模型Geek定义了一个自定义方法,以便从json对象中保存它.

def jsonToModel(self, jsonObj): 
    data = json.loads(jsonObj)
    self.firstname = data['firstname']
    self.lastname = data['lastname']
    self.age = data['age']
Run Code Online (Sandbox Code Playgroud)

在模型中保存json对象如:

>> obj = Geek()
>> obj.jsonToModel(jsondata)
>>obj.save
Run Code Online (Sandbox Code Playgroud)

现在我想更新一个现有的模型实例说,我有以下json数据的模型实例id = 1

{
"lastname": "kumar"
}


>> ob = Geek.objects.get(id=1)
Run Code Online (Sandbox Code Playgroud)

现在我怎么能这样做没有明确使用fieldname(lastname).

>> ob.*field* = *data_for_field*  
>> ob.save()
Run Code Online (Sandbox Code Playgroud)

Jon*_*ans 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()
Run Code Online (Sandbox Code Playgroud)

但是,这有点危险,因为它允许将任意键设置为对象的属性.为避免这种情况,您可以在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)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

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
Run Code Online (Sandbox Code Playgroud)