【问题标题】:Allowing empty dates with Marshmallow允许使用 Marshmallow 的空日期
【发布时间】:2020-03-02 15:07:00
【问题描述】:

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

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

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}")

【问题讨论】:

    标签: python marshmallow


    【解决方案1】:

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

    data = dict(training_necessary='Yes')
    

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

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

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

    【讨论】:

    • 谢谢杰罗姆,工作得很好。我可能还没有尝试过的少数组合之一......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多