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