【问题标题】:handling optional field validation处理可选字段验证
【发布时间】:2016-01-09 06:14:40
【问题描述】:

我有一个简单的问题,我不确定处理它的最佳方法。我的架构定义如下:

class MySchema(Schema):
    title = fields.String(required=True)
    imageUrl = fields.Url()

imageUrl 是一个可选字段,有时它会是 None/null。如果发生这种情况,没关系,它不需要是有效的 url。但是当我这样做时:

my_schema.load(request.get_json())

对于 PUT 的传入数据,url 字段记录错误:Field may not be null.

我认为在 load 调用中使用 partial=True 会起作用,但事实并非如此。我也不喜欢这样,因为这不是部分对象,而是完整对象,恰好我的一些字段在数据库中可以为空。

当 imageUrl 为非 null 时如何让 marshmallow 验证它,但在它为 null 时忽略它?

【问题讨论】:

    标签: marshmallow


    【解决方案1】:

    我现在想通了。 cdonts 的答案很接近,但对我不起作用。我仔细阅读了文档。 default 用于为序列化期间的缺失值提供默认值。

    但是我在反序列化和验证期间遇到了这个问题。也有参数。

    allow_nonemissing 的组合在我的情况下很有用并解决了我的问题。

    【讨论】:

      【解决方案2】:

      我认为你应该提供一个默认值。

      class MySchema(Schema):
          title = fields.String(required=True)
          imageUrl = fields.Url(default=None)
      

      希望对你有帮助!

      【讨论】:

      • 谢谢,但不幸的是这不起作用。如果 imageUrl=None 中有请求,则默认无效,验证仍然失败。如果一个请求的 imageUrl 完全丢失,则不会出现验证错误,但不会将密钥添加到加载的请求中。
      • 您的示例无效。它不起作用。
      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2018-08-15
      相关资源
      最近更新 更多