You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:20:27