1

我正在尝试编写一个执行插入或更新的网络服务。请求是一个带有标题的帖子,值包含表名、列名和要为每列设置的值,我正在解析请求标题并形成一个参数 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"]为空。这是为什么?难道我做错了什么?不保存假设只更新指定的字段吗?

4

2 回答 2

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更新方法:

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

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

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

编辑:

关于如何在 django 中工作的简要总结。save这就是我所说的是否发生INSERT或发生的意思UPDATE。除非您的post_datadict 包含所有字段的空值,否则请阅读有关如何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,以便在保存到数据库之前填充所有正确的值。

于 2012-12-26T10:44:10.870 回答
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()
于 2012-12-26T13:52:38.247 回答