模型保存仅更新特定字段

时间:2012-12-26 10:29:14

标签: python django django-models

我正在尝试编写一个执行插入或更新的Web服务。 请求是一个带有头的帖子,值包含表名,列名和要为每列设置的值,我正在解析请求头并形成一个参数dict

def handel_request(request): if request.method == "POST":
        param_dict = formParmDict(request)
        ##if insert param_dict["Model"] is {'pk':1,'field1':100,'field2':200}
        ##if update param_dict["Model"] is {'pk':1,'field1':100}
        Model(**param_dict["Model"]).save() ## if update then sets field2 to null
        return HttpResponse()
    else:
        return HttpResponseBadRequest()

.save()执行插入时,此工作正常。 在更新的情况下,即如果param_dict["Model"]包含要更新的{pk:1, field1:somevalue},则它将除param_dict["Model"]中指定的字段之外的其余字段设置为空。这是为什么?难道我做错了什么?不保存假设只更新指定的字段?

2 个答案:

答案 0 :(得分:2)

这是你应该如何更新。

Model(**param_dict["Model"]).save()

您正在使用相同的id创建新实例。相反,您应该get实例,然后适当地更新它。

m = Model.objects.get(id=param_dict['id'])
m.field = param_dict['some_field']
m.save()

或者,您可以使用Manager update方法:

Model.objects.filter(id=param_dict['id']).update(**param_dict['Model'])

如果您不确定该记录是否已存在,还有get_or_create方法。

您可以尝试使用REST框架,例如tasty-piedjango-rest-framework,这可能会减轻您遇到的一些问题。

编辑:

关于save如何在django中工作的brief summary。这就是我对INSERTUPDATE是否正在发生的意思。除非您的post_data dict包含所有字段的空值,否则请阅读save如何工作的文档,以便更全面地了解django的工作原理。

所以,你的情况是这样的:

dict = {'id': 1, 'field1': 'my_value'}
m = Model(**dict)
m.id       # 1
m.field1   # my_value
m.field2   # None (because you haven't set it, it defaults to None
m.save()   # UPDATEs the existing instance with id 1 with ALL of the values of `m`

因此,您要保存包含None值的实例。这就是为什么我建议您执行get,以便在保存到数据库之前填充所有正确的值。

答案 1 :(得分:0)

也许你应该使用这样的功能:

def insert_or_update(param_dict):
    pk = param_dict.get('pk', None)
    if pk:
        Model.objects.filter(pk=pk).update(**param_dict)
    else:
        Model(**param_dict)
        Model.save()