MongoEngine中IntField默认值在upsert_one操作下未正常保存
问题原因及解决思路
为什么version字段没被保存?
这是因为upsert_one的执行逻辑和直接创建文档实例完全不同:
- 当你用
MyDocument(foo="xxx", bar="xxx")创建实例时,MongoEngine会触发字段的默认值填充逻辑,把version设为1,之后保存时会把所有字段(包括默认值字段)写入数据库。 - 但
upsert_one是直接生成MongoDB的更新/插入指令,它只会把你明确传入的字段打包成$set操作的内容,不会主动去读取字段的默认值并添加进去。MongoDB执行这个指令时,自然不会自动补上version字段。
举个直观的对比,upsert_one发送给数据库的指令大概是这样:
{ "q": {"foo": "Hello"}, "u": {"$set": {"foo": "World", "bar": "ups"}}, "upsert": true }
里面根本没提到version,所以插入新文档时不会有这个字段。
怎么让upsert_one带上默认值?
有两种简单的处理方式:
- 手动传入默认值:
MyDocument.objects({"foo":"Hello"}).upsert_one(foo="World", bar="ups", version=1)
- 从字段定义里动态获取默认值,避免硬编码:
default_version = MyDocument.version.default MyDocument.objects({"foo":"Hello"}).upsert_one(foo="World", bar="ups", version=default_version)
内容的提问来源于stack exchange,提问作者mko
相关产品推荐
相关产品推荐

