gpt4 book ai didi

python - 模型保存仅更新特定字段

转载 作者:行者123 更新时间:2023-12-01 05:51:37 25 4
gpt4 key购买 nike

我正在尝试编写一个执行插入或更新的网络服务。该请求是一个带有标题的帖子,其中包含表名、列名和为每列设置的值,我正在解析请求标题并形成参数字典

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"] 中指定的为 null。这是为什么?难道我做错了什么? save 不是应该只更新指定的字段吗?

最佳答案

不是您应该如何更新。

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

您正在使用相同的 id 创建一个新实例。相反,您应该获取实例,然后适本地更新它。

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

或者,您可以使用管理器 update方法:

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

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

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

编辑:

一个brief summary关于 save 在 django 中的工作原理。这就是我关于是否发生 INSERTUPDATE 的意思。除非您的 post_data 字典包含所有字段的空值,否则请阅读有关 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 操作,以便在保存到数据库之前填充所有正确的值。

关于python - 模型保存仅更新特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com