我尝试从网页获取数据。该页面包含多个发行信息,但不允许设置值。即从/到的测试日期可能是一个空字符串。
现在,我尝试反序列化从页面吸取的所有数据,以将其插入数据库,并遇到处理空日期的问题。
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=True
或default=''
的几种组合,但是没有一种组合帮助我度过难关。那么,如何管理允许空日期?在这种情况下,将默认值设置为类似于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}")
答案 0 :(得分:1)
我根本不会传递任何价值。
data = dict(training_necessary='Yes')
或者我将日期字段设为allow_none
,然后传递None
,而不是一个空字符串。
data = dict(training_necessary='Yes', test_from=None, test_to=None)
如果问题是您的输入包含空字符串,那是客户的问题,但是您可以添加pre_load
方法以在反序列化之前从输入中删除空字符串。这或多或少等同于修改您从页面上抓取的值,然后再将其输入棉花糖。