python,mongo和棉花糖:日期时间挣扎

问题描述 投票:1回答:1

我正在尝试做一些非常简单的事情:获取当前时间,用棉花糖验证我的对象,并将其存储在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 ...

python-3.x mongodb datetime pymongo marshmallow
1个回答
1
投票

棉花糖的目的是将序列化的数据(例如JSON,isoformat字符串等)加载到实际的Python对象(int,datetime等)中。相反,将其从对象转储到序列化的字符串中。

棉花糖也仅在负载时提供验证。转储时,数据来自应用程序,不需要验证。

© www.soinside.com 2019 - 2024. All rights reserved.