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
相关产品推荐
相关产品推荐

