to_json将DateTime从MongoDB转换为Python,并且后退操作不起作用

时间:2019-06-18 04:01:25

标签: python mongodb mongoengine

我有一个带有日期字段的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}"

2 个答案:

答案 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中的原始对象,并确保它们都相同。