有没有更好的方法来覆盖Marshmallow.fields.List?

时间:2018-12-11 17:59:42

标签: python json python-3.x marshmallow

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

1 个答案:

答案 0 :(得分: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.']}