棉花糖允许空约会

时间:2020-03-02 15:07:00

标签: python marshmallow

我尝试从网页获取数据。该页面包含多个发行信息,但不允许设置值。即从/到的测试日期可能是一个空字符串。

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

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=''的几种组合,但是没有一种组合帮助我度过难关。那么,如何管理允许空日期?在这种情况下,将默认值设置为类似于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}")

1 个答案:

答案 0 :(得分:1)

我根本不会传递任何价值。

data = dict(training_necessary='Yes')

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

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

如果问题是您的输入包含空字符串,那是客户的问题,但是您可以添加pre_load方法以在反序列化之前从输入中删除空字符串。这或多或少等同于修改您从页面上抓取的值,然后再将其输入棉花糖。

相关问题