【问题标题】:Deserialize Date in Marshmallow在棉花糖中反序列化日期
【发布时间】:2021-01-27 15:22:48
【问题描述】:

我有一个表(START_DATE、TEXT、DECIMAL、INTEGER)。 我从数据库中读取数据并尝试对数据进行反序列化。


class Response(Schema):
    class Meta:
        json_module = simplejson
    data = fields.List(fields.List(fields.Raw()))

回复:


"data": [
        [
            "Tue, 26 Jan 2021 00:00:00 GMT",
            "USD",
            78790.400000,
            79262
        ],
        [
            "Mon, 25 Jan 2021 00:00:00 GMT",
            "USD",
            68852.340000,
            77365
        ]

如何将日期格式更改为 '%Y-%m-%dT%H:%M:%S%z' 我做了以下更改,但日期格式没有更改。


class Response(Schema):
    class Meta:
        json_module = simplejson
        dateformat = '%Y-%m-%dT%H:%M:%S%z'
    data = fields.List(fields.List(fields.Raw()))

【问题讨论】:

    标签: python date-formatting marshmallow


    【解决方案1】:

    日期格式不会神奇地应用于任何看起来像数据的字符串。

    您需要为每个值指定字段。

    根据您的示例,您的架构可能看起来像

    class Response(Schema):
        data = fields.Tuple((
            fields.DateTime(format='%Y-%m-%dT%H:%M:%S%z'),
            fields.String(),
            fields.Float(),
            fields.Integer(),
        ))
    

    【讨论】:

    • 问题中的数据来自数据库。为了简单起见,我将列限制更改为 4。来自数据库的数据有 100 多列。所有列都由 field.raw 自动识别。我的问题是,当 marshmallow 将类型识别为 dateformat 而不是常规 dateformat 时,我们可以将其更改为自定义的类型。当我们预先知道列的类型及其类型时,您提供的建议是正确的。但在我的情况下,列列表很大,我们从许多不同的表中查询。
    • 好吧,我完全忘记了推断字段功能。但它只适用于 Meta 中声明的字段,例如 fields = ('birthdate', 'name')。
    • 这里您使用的是 Raw 字段,数据按原样传递,marshmallow 不知道它的类型。我认为它显示为日期时间字符串,因为这就是 str(data) 的样子,而不是因为 marshmallow 将其序列化为日期时间。
    • 谢谢杰罗姆。看起来我们在棉花糖方面无能为力。数据库正在格式化日期时间并将其作为字符串发送。
    • 恐怕是这样。我很惊讶驱动程序没有返回日期时间对象。但即使是这样,marshmallow 的 Raw 字段也不会将其视为日期时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2016-06-18
    • 2019-08-03
    • 2018-11-12
    • 2019-03-04
    相关资源
    最近更新 更多