我创建了一个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)


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

使用:Python 3.6.7和marshmallow-3.0.0b19

最佳答案

我认为您的最初尝试接近正常工作。您只需要考虑传入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.']}

关于python - 有没有更好的方法来覆盖Marshmallow.fields.List?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53729831/

10-12 06:01