【问题标题】:Marshmallow - turn None string to empty stringMarshmallow - 将 None 字符串变为空字符串
【发布时间】:2020-07-13 11:22:21
【问题描述】:

我收到一封电子邮件正文,其中包含None 而不是"" 的一些字符串。

我已尝试使用缺失、默认、allow_none 和其他我在网上找到的 hack,但没有任何效果。

我想在我的架构中将 None 转换为 ""。我认为一个简单的email = fields.String(missing = "") 会起作用,但我猜 None 不算丢失。

架构:

class CustomerSchema(Schema):
    @post_dump
    def change_none_to_string(self, data, **kwargs):
        for field in data:
            if data[field] is None:
                data[field] = ""
        return data

    firstname = fields.String(missing = "")
    lastname = fields.String(missing = "")
    email = fields.String(missing = "")

【问题讨论】:

    标签: python marshmallow


    【解决方案1】:

    您可以使用后转储或预加载功能在处理之前更改输入或输出中的内容,例如添加:

    @post_dump
    def change_none_to_string(self, data, **kwargs)
        for field in data:
            if data[field] is None:
                data[field] = ""
        return data
    

    到您的架构应该意味着您的输出将所有“无”字段替换为“”,并且您可以通过预加载输入来执行类似的操作。

    假设您的输入是 json 中的原始文本(可能不是,我没有看到您的输入),这应该可以完成工作,但这取决于您输入的格式:

    @pre_dump
    def change_none_to_string_input(self, data, **kwargs):
        for field in data:
            data[field] = data[field].replace("null", '""')
        return data
    

    查看https://marshmallow.readthedocs.io/en/stable/extending.html了解更多详情。

    【讨论】:

    • 这个我已经试过了,这个不行。我仍然收到“字段可能不为空”错误。
    • 这大概是因为您使用它来验证传入信息而不是输出JSON,因此您可能需要pre_load而不是post_dump,然后您需要遍历输入字符串替换所有“无”与“”的元素。我将在我的答案中添加代码来做到这一点。
    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多