问题描述
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,而不能使用所得的带类型注释的原始文档作为需要“正常”语言类型的对象的方法的输入。