我正在尝试编写一个执行插入或更新的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"]
中指定的字段之外的其余字段设置为空。这是为什么?难道我做错了什么?不保存假设只更新指定的字段?
答案 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-pie或django-rest-framework,这可能会减轻您遇到的一些问题。
编辑:
关于save
如何在django中工作的brief summary。这就是我对INSERT
或UPDATE
是否正在发生的意思。除非您的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()