首页 > 解决方案 > mongoengine:使用日期字段更新文档失败 << self.error('cannot parse date "%s"' % value) >>

问题描述

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}

但是,当我尝试 update() 整个 Mongoengine 文档时,我得到了这个错误堆栈:

  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 文档。

标签: pythonmongodbdatemongoengine

解决方案


我不熟悉 mongoengine,但您似乎已经使用to_json调用将文档序列化为扩展 json。要扭转这种情况,您需要使用例如此处描述的方法将扩展的 json 解析为适当的 python 对象结构。通常,您不能使用普通的 json 解析器解析扩展的 json,并使用生成的类型注释原始文档作为需要“正常”语言类型对象的方法的输入。


推荐阅读