【问题标题】:Is there a better way to override Marshmallow.fields.List?有没有更好的方法来覆盖 Marshmallow.fields.List?
【发布时间】:2018-12-11 17:59:41
【问题描述】:

我创建了一个 NonEmptyList Marshmallow.fields.List 对象,以确保输入 JSON 列表具有至少一个元素。这就是我所做的。

class NonEmptyList (fields.List):
    def __init__ (self, *args, **kwargs):
        kwargs['validate'] = Length(min=1)
        super(NonEmptyList, self).__init__(*args, **kwargs)

这有一个问题,它覆盖了传递给对象的验证参数。因此,如果有人尝试将我的新 NonEmptyList 与他们自己的 validate 参数一起使用,它将不起作用。我试图推送到我在代码中找到的私有字段 _validators,但出现名称错误。另外,这不是一个记录在案的字段,因此使用它不是一个好主意。

使用:Python 3.6.7 和 marshmallow-3.0.0b19

【问题讨论】:

    标签: python json python-3.x marshmallow


    【解决方案1】:

    我认为您最初的尝试非常接近正常工作。您只需要考虑传入 validate 关键字的可能性 - 此 kwarg 接受可调用的验证器 验证器的集合。在这两种情况下,您都需要确保不要覆盖传递的对象,而只需将最小长度要求附加到其他要求(如果有)。

    类似这样的:

    class NonEmptyList(fields.List): 
        def __init__ (self, *args, **kwargs): 
            validate = kwargs.pop("validate", []) 
            if callable(validate): 
                validate = [validate, Length(min=1)] 
            else: 
                validate = list(validate) + [Length(min=1)] 
            kwargs["validate"] = validate 
            super(NonEmptyList, self).__init__(*args, **kwargs) 
    

    演示:

    >>> class LibrarySchema(Schema): 
    ...     books = NonEmptyList(Str) 
    ...
    >>> LibrarySchema().load({"books": ["The Stinky Cheese Man and Other Fairly Stupid Tales"]})
    {'books': ['The Stinky Cheese Man and Other Fairly Stupid Tales']}
    >>> LibrarySchema().load({"books": []})
    # ValidationError: {'books': ['Shorter than minimum length 1.']}
    

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2014-08-31
      • 1970-01-01
      相关资源
      最近更新 更多