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

MongoEngine中如何用DateTime映射数据?解决MapField参数报错

问题解答

当然可以在MongoEngine中用datetime作为MapField的键,但你的用法有误,才导致了Argument to MapField constructor must be a valid field错误。

错误原因

你在MapField里传了Python原生的datetime类作为键类型,但MongoEngine的MapField要求第一个参数必须是MongoEngine的字段类型(比如DateTimeField、StringField这类),而不是原生的数据类型。原生datetime不属于MongoEngine的Field子类,所以被判定为无效字段。

修正后的代码

首先要导入DateTimeField,然后把MapField的第一个参数改成DateTimeField():

from datetime import datetime
from mongoengine import StringField, MapField, EmbeddedDocument, FloatField, IntField, DateTimeField  # 新增DateTimeField导入

class PlaySession(EmbeddedDocument):
    hours_played = FloatField(db_field="hoursPlayed")
    enjoyment = IntField(db_field="enjoyment")
    number_of_players = IntField(db_field="playerNum")


class GameDoc(Document):
    game = StringField(db_field="game")
    console = StringField(db_field="console")
    sessions = MapField(DateTimeField(), PlaySession, db_field="sessions")  # 替换原生datetime为DateTimeField实例

补充说明

MongoDB的文档键只能是字符串类型,当你用DateTimeField作为Map的键时,MongoEngine会自动把datetime对象序列化为ISO格式的字符串存储到数据库,读取时再反序列化为datetime对象,无需手动处理转换逻辑。

内容的提问来源于stack exchange,提问作者linkey apiacess

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:30:55