Mongoengine Document 对象无法使用 from_json 进行更新

问题描述 投票:0回答:4

这里

我需要使用

from_json
更新现有文档数据。

当我使用

from_json
喜欢

>> user = User.objects(pk=2).first()
>> print user.to_json()

以上显示

>> {"_id": 1, "_cls": "User", "name": "OldName"}

现在我更新现有的

user
对象

>> user = user.from_json(json.dumps({"_id": 1, "_cls": "User", "name": "NewName"}))
>> user.save()
>> print user.to_json()

它显示

>> {"_id": 1, "_cls": "User", "name": "NewName"}

但无法在数据库中更新。

我再次查询相同的

user
它显示

>> {"_id": 1, "_cls": "User", "name": "OldName"}

我的问题是如何使用文档对象方法更新现有数据

from_json

python mongoengine
4个回答
2
投票

对我来说以下工作有效:

user.update(**mydictname) #mydictname contains the dictionary of values I want to update
user.save()
user.reload() #not doing this makes the changes available only after the object is reloaded elsewhere

1
投票

恐怕这是一个常见问题,可能尚未解决,这是 MongoEngine 源代码的链接,您可以搜索“from_json”以查看是否可以通过弄清楚该函数实际在做什么来进行破解:https://github.com/MongoEngine/mongoengine/blob/master/mongoengine/queryset/base.py;

对我来说,我只需迭代 json 数据的

(key, value)
并通过以下方式手动设置:

Batman = User.objects.get('user_id'='blah')
data = {'username':'batman', 'password':'iLoveGotham'}
for (key, val) in data.items():
  Batman[key] = val
Batman.save()

它可以工作,但希望

from_json
函数能够真正工作,以便这个过程变得更加优雅。


0
投票

如果您在 Mongo Shell 中搜索该文档,它也不会更新吗?如果没有,请停止阅读这里。保存不会自动更新对象,但我想如果你调用类似的东西:

>> user = user.from_json(json.dumps({"_id": 1, "_cls": "User", "name": "NewName"}))
>> user.save()
>> user.reload()
>> print user.to_json()

我自己刚刚学习 Mongoengine,但这里有一个很好的资源:http://docs.mongoengine.org/guide/


0
投票

有点晚了,但是这个thread中的解决方案对我有用。要更新现有文档,您需要将created=True参数添加到from_json。

引用链接上的解释:

.from_json 方法实际上采用一个未记录的创建参数,默认为 False。如果将其设置为 True,您将获得预期的行为。

当使用 .from_json(json_data,created=False) 和 json_data 中的 id 属性时 mongoengine 假设您正在为其提供现有文档的初始结构(这听起来很公平),因此当您 .save() 它时,它不会保存任何内容,因为它假设没有任何更改,但一旦您更新属性,它就会开始跟踪更改,它实际上会保存它们。

使用 .from_json(json_data,created=True) 时 mongoengine 会认为它是您正在加载的全新文档,但由于它最终会触发 upsert 查询(而不是插入),因此它将工作并更新名称

因此使用以下代码可以按预期工作:

user = user.from_json(json.dumps({"_id": 1, "_cls": "User", "name": "NewName"}), created=True) 
user.save()
print user.to_json()
© www.soinside.com 2019 - 2024. All rights reserved.