Marshmallow 允许空日期

Allowing empty dates with Marshmallow

我尝试从网页获取数据。此页面包含多个发布信息,但不允许设置值。 IE。测试日期 from/to 可能是一个空字符串。

现在我尝试反序列化从页面吸取的所有数据以将其插入数据库并面临处理空日期的问题。

from marshmallow import fields, Schema, ValidationError

class TestSchema(Schema):
    training_necessary = fields.Function(deserialize=lambda x: True if x == 'Yes' else False)
    test_from = fields.Date()
    test_to = fields.Date()

data = dict(training_necessary='Yes', test_from='', test_to='')

try:
    validated = TestSchema().load(data)
except ValidationError as err:
    print(f"{err}")

结果:

{'test_to': ['Not a valid date.'], 'test_from': ['Not a valid date.']}

我已经尝试了 allow_none=Truedefault='' 的几种组合,但其中 none 帮助我通过了。那么,如何设法允许空日期呢?在这种情况下,将默认值设置为类似于 1970-01-01 将无济于事。

有什么提示吗?

问候,托马斯

+++ 编辑:解决方案+++ 这是在 Jérômes 提供帮助后我最终得到的工作代码:

from marshmallow import fields, Schema, ValidationError, pre_load

class TestSchema(Schema):
    training_necessary = fields.Function(deserialize=lambda x: True if x == 'Yes' else False)
    test_from = fields.Date(allow_none=True)
    test_to = fields.Date(allow_none=True)

    @pre_load(pass_many=False)
    def string_to_none(self, data, many, **kwargs):
        turn_to_none = lambda x: None if x == '' else x
        for k, v in data.items():
            data[k] = turn_to_none(v)
        return data

data = dict(training_necessary='Yes', test_from='', test_to='')

try:
    validated = TestSchema().load(data)
except ValidationError as err:
    print(f"{err}")

我不会传递任何值。

data = dict(training_necessary='Yes')

或者我将日期字段设为 allow_none 并传递 None,而不是空字符串。

data = dict(training_necessary='Yes', test_from=None, test_to=None)

如果问题是您的输入包含空字符串,我会说这是一个客户端问题,但您可以添加一个 pre_load 方法来在反序列化之前从输入中删除空字符串。这或多或少等同于在将它们提供给棉花糖之前修改您从页面上抓取的值。