mongoengine:使用日期字段更新文档失败,显示<< << self.error'无法解析日期“%s”'%值>>

问题描述

Mongoengine真的开始让人感到痛苦了。

我正在通过Python / Mongoengine从包含创建日期的MongoDB集合中查询文档。

我使用to_json()将整个输出转换为json字符串

    document = Qkey.objects(id=id)
    djson = document.to_json()

其中包含以下内容

...
"date_created": {
    "$date": 1595784271766
},...

然后我将整个JSON结构放入Web应用程序的textarea字段中,以使用户可以更改JSON数据(通常,他不会更改“ date_created”值,而会更改其他一些字段)。

我阅读了整个文本区域,并将其从大字符串转换回Python字典。

如预期的那样,字典项在打印时如下所示:

date_created: {'$date': 1595784271766}

但是,当我然后尝试对整个Mongoengine文档进行update()时,却出现此错误堆栈:

  File "/webupdate/app/edit.py",line 38,in update_document
    document.update(**attributes_json)
  File "/webupdate/env/lib/python3.6/site-packages/mongoengine/queryset/base.py",line 530,in update
    update = transform.update(queryset._document,**update)
  File "/webupdate/env/lib/python3.6/site-packages/mongoengine/queryset/transform.py",line 317,in update
    value = field.prepare_query_value(op,value)
  File "/webupdate/env/lib/python3.6/site-packages/mongoengine/fields.py",line 593,in prepare_query_value
    return super().prepare_query_value(op,self.to_mongo(value))
  File "/webupdate/env/lib/python3.6/site-packages/mongoengine/base/fields.py",line 196,in prepare_query_value
    self.validate(value)
  File "/webupdate/env/lib/python3.6/site-packages/mongoengine/fields.py",line 536,in validate
    self.error('cannot parse date "%s"' % value)
  File "/webupdate/env/lib/python3.6/site-packages/mongoengine/base/fields.py",line 171,in error
    raise ValidationError(message,errors=errors,field_name=field_name)
mongoengine.errors.ValidationError: cannot parse date "None"

当我完全删除date_created时,此更新有效。

我希望任何人都可以向我指出正确的方向,如何通过JSON处理Python字典来处理日期字段,以更新整个MongoDB文档。

解决方法

Everywhere in the documentation,似乎使用Python的datetime对象更新了DateTimeField。您是否尝试过将时间戳转换为update_document中使用的映射中的日期时间:

date_created: {'$date': datetime.fromtimestamp(1595784271766) }

让我知道是否有帮助。

编辑基于此片段(行号:site-packages / mongoengine / fields.py中的533-536,在OP的错误中提到),看来问题确实与value有关不是日期或日期时间实例:

def validate(self,value):
    new_value = self.to_mongo(value)
    if not isinstance(new_value,(datetime.datetime,datetime.date)):
        self.error('cannot parse date "%s"' % value)

不确定self.to_mongo(value)是否没有更早返回None。

,

我对mongoengine不熟悉,但是您似乎已经使用to_json调用将文档序列化为扩展json。为了解决这个问题,您需要使用here等方法将扩展的json解析为适当的python对象结构。通常,您不能使用普通的json解析器来解析扩展的json,而不能使用所得的带类型注释的原始文档作为需要“正常”语言类型的对象的方法的输入。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...