【问题标题】:Omit instances of an invalidated nested many field in Marshmallow省略 Marshmallow 中无效的嵌套多字段的实例
【发布时间】:2019-11-25 08:47:05
【问题描述】:

marshmallow 中是否可以省略嵌套模式的实例,这些实例验证失败而父模式失败?例如,一个 Atom 提要可以有许多条目。如果一个条目缺少必填字段,是否可以省略该条目,以便提要及其正确解析的条目通过验证而没有失败的条目?

from marshmallow import Schema


class Feed(Schema):
    """Atom/RSS feed."""
    ...
    entries = fields.Nested('Entry', many=True)
    ...

class Entry(Schema):
    """Article of an Atom/RSS feed."""
    ...
    title = fields.String(required=True)
    link = fields.Url(required=True)
    ...

验证 Feed 之前

...
"entries": [
  {
    "title": "Title A",
    "link": "http://httpbin.org/status/200"
  },
  {
    "title": "",
    "link": "",

  },
  {
    "title": "Title C",
    "link": "http://httpbin.org/status/200"
  },
]
...

验证 Feed 后

...
"entries": [
  {
    "title": "Title A",
    "link": "http://httpbin.org/status/200"
  },
  {
    "title": "Title C",
    "link": "http://httpbin.org/status/200"
  },
]
...

【问题讨论】:

    标签: python python-3.x marshmallow


    【解决方案1】:

    pre_load 装饰器可用于过滤嵌套字段,但我假设每个嵌套模式都被反序列化两次:一次在 pre_load 期间,一次在加载期间。

    class Feed(Schema):
        ...
        entries = fields.Nested('Entry', many=True)
        ...
    
        @pre_load
        def filter_entries(self, data, **kwargs):
            schema = Entry()
            filtered = []
            for entry in data['entries']:
                try:
                    filtered.append(schema.load(entry))
                except ValidationError:
                    continue
            data['entries'] = filtered
            return data
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2019-02-28
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多