我正在尝试做一些非常简单的事情:获取当前时间,用棉花糖验证我的对象,并将其存储在mongo中
python 3.7
要求:
datetime==4.3
marshmallow==3.5.1
pymongo==3.10.1
schema.py
from marshmallow import Schema, fields
...
class MySchema(Schema):
user_id = fields.Str(required=True)
user_name = fields.Str()
date = fields.DateTime()
account_type = fields.Str()
object = fields.Raw()
preapredata.py
from datetime import datetime
from schema.py import Myschema
...
dt = datetime.now()
x = dt.isoformat()
data = {
"user_id": '123123123',
"user_name": 'my cool name',
"date": x,
"account_type": 'another sting',
"trade": {'some':'dict'}
}
# validate the schema for storage
validator = MySchema().load(data)
if 'errors' in validator:
log.info('validator.errors')
log.info(validator.errors)
...
res = MyService().create(
data
)
myservice.py
def create(self, data):
log.info("in creating data service")
log.info(data)
self.repo.create(data)
return MySchema().dump(data)
连接到mongo很好,正在保存没有日期时间且没有问题的其他数据。在将日期时间传递给日期键之前,我似乎经历了数百种格式化日期时间的变化,并且在模式字段的内联和元类中都指定了“格式”选项,例如:
#class Meta:
# datetimeformat = '%Y-%m-%dT%H:%M:%S+03:00'
我尝试的大多数变化导致:
{'date': ['Not a valid datetime.']}
我终于通过使用简单的方法来通过验证
x = dt.isoformat()
并将字段模式保留为默认值(date = fields.DateTime())
但是当我通过棉花糖转回时,我得到了
AttributeError: 'str' object has no attribute 'isoformat'
记录是在mongo DB中创建的,但是字段类型是字符串,理想情况下,我想利用本地mongo日期字段
如果我尝试通过
datetime.now()
到目前为止,它失败,并带有
{'date': ['Not a valid datetime.']}
与]相同>
datetime.utcnow()
任何指导都非常感谢。
编辑:绕过棉花糖并使用其中一个时>
datetime.now(pytz.utc)
或
datetime.utcnow()
字段数据按预期的日期存储在mongo中,所以我认为这个问题可以更简洁地陈述为:我如何拥有棉花糖field.DateTime()验证这两种格式?
编辑2:因此,由于杰罗姆(Jérôme)在下文提供的有见地的答案,我们已经开始重构。对于想要“扭曲”棉花糖以使它像原来的问题那样表现的人,我们最终选择了:
date = fields.DateTime( #dump_only=True, default=lambda: datetime.utcnow(), missing=lambda: datetime.utcnow(), allow_none=False )
即完全跳过传递日期,让棉花糖从丢失中生成它,这满足了我们的用例。
[我正在尝试做一些非常简单的事情:获取当前时间,用棉花糖验证我的对象,将其存储在mongo python 3.7中的要求:datetime == 4.3 marshmallow == 3.5.1 pymongo == 3.10.1 ...
棉花糖的目的是将序列化的数据(例如JSON,isoformat字符串等)加载到实际的Python对象(int,datetime等)中。相反,将其从对象转储到序列化的字符串中。
棉花糖也仅在负载时提供验证。转储时,数据来自应用程序,不需要验证。