我有一个带有日期字段的MongoDB。我定义这样的对象:
"
{
"_id" : ObjectId("5d019fbdace49e498de7d915"),
"created_date" : ISODate("2018-05-18T16:00:00.000Z"),
"published_date" : ISODate("2018-05-18T16:00:00.000Z")
}
"
Mongoengine模型如下:
MyObject(Document):
created_date = DateTimeField(default = datetime.datetime.utcnow)
当我从数据库中获取一个对象时,它出现在Python中:
'created_date':{'$date': 1463587200000}
我得到对象执行to_json并从from_json返回。 to_json()函数将Python日期时间转换为这种格式。问题是我不知道该如何处理。
如果我只是尝试将对象保存回去(即使我不触摸此字段,数据也是json)
doc = MyDoc(**data)
doc.save()
我有以下例外情况:
mongoengine.errors.ValidationError: ValidationError (MyObject:5d019aca1c9d4400008cb934) (cannot parse date "{'$date': 1463587200000}"
答案 0 :(得分:2)
to_json()
无助于此日期转换。可能的解决方案是从数据库中检索后使用to_mongo()
转换数据,然后使用to_dict()
将数据转换成Python对象。
答案 1 :(得分:0)
使用您提到的数据,我没有任何问题。 我将其插入到mongo中:
obj = {
"_id" : ObjectId("5d019fbdace49e498de7d915"),
"created_date" : ISODate("2018-05-18T16:00:00.000Z"),
"published_date" : ISODate("2018-05-18T16:00:00.000Z")
}
db.my_doc.insertOne(obj)
然后我可以阅读,修改并保存在mongoengine中:
from mongoengine import *
import datetime as dt
connect()
class MyDoc(Document):
created_date = DateTimeField(default=dt.datetime.utcnow)
published_date = DateTimeField(default=dt.datetime.utcnow)
doc = MyDoc.objects.first()
assert doc.created_date == dt.datetime(2018, 5, 18, 16, 0)
assert doc.published_date == dt.datetime(2018, 5, 18, 16, 0)
doc.created_date = dt.datetime.utcnow()
doc.save()
但是,如果我插入以下内容:
{
"_id" : ObjectId("5d019fbdace49e498de7d916"),
"created_date" : {
"$date" : 1463587200000
},
"published_date" : ISODate("2018-05-18T16:00:00Z")
}
然后我得到您提到的ValidationError。 Mongoengine的DateTimeField可以在mongodb中正确解析为ISODate,在这种情况下,听起来只是您的某些文档具有不同的结构(或者应该更改您的架构)。仔细检查mongodb中的原始对象,并确保它们都相同。