to_json конвертирует DateTime из MongoDB в Python и обратная операция не работает - PullRequest
0 голосов
/ 18 июня 2019

У меня есть 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}"

1 Ответ

0 голосов
/ 18 июня 2019

У меня нет проблем с использованием данных, которые вы упомянули.Я вставил его в монго с помощью:

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, которую вы упомянули.DateTimeField Mongoengine правильно разрешает ISODate в mongodb, в этом случае это просто звучит так, как будто некоторые из ваших документов имеют другую структуру (или, возможно, это ваша схема, которая должна быть изменена).Дважды проверьте необработанные объекты в mongodb и убедитесь, что они все одинаковые.

...