24

マシュマロを使用してリストを検証することは可能ですか?

class SimpleListInput(Schema):
    items = fields.List(fields.String(), required=True)

# expected invalid type error
data, errors = SimpleListInput().load({'some': 'value'})

# should be ok 
data, errors = SimpleListInput().load(['some', 'value'])

それとも、オブジェクトのみを検証することが期待されていますか?

4

3 に答える 3

33

トップレベルのリストを検証するには、リスト アイテム スキーマをmany=True引数でインスタンス化する必要があります。

例:

class UserSchema(marshmallow.Schema):
    name = marshmallow.fields.String()

data, errors = UserSchema(many=True).load([
    {'name': 'John Doe'},
    {'name': 'Jane Doe'}
])

ただし、それでもオブジェクト スキーマである必要があります。Marshmallow は、最上位の非オブジェクト リストの使用をサポートしていません。非オブジェクト型の最上位リストを検証する必要がある場合、回避策は、型の List フィールドを 1 つ持つスキーマを定義し、ペイロードをオブジェクトであるかのようにラップすることです。

class SimpleListInput(marshmallow.Schema):
    items = marshmallow.fields.List(marshmallow.fields.String(), required=True)

payload = ['foo', 'bar']
data, errors = SimpleListInput().load({'items': payload})
于 2016-12-01T00:23:46.737 に答える
13

SimpleListInput は、"items" プロパティを持つクラスです。プロパティ「アイテム」は、文字列のリストを受け入れる人です。

>>> data, errors = SimpleListInput().load({'items':['some', 'value']})
>>> print data, errors
{'items': [u'some', u'value']} 
{}
>>> data, errors = SimpleListInput().load({'items':[]})
>>> print data, errors
{'items': []} 
{}
>>> data, errors = SimpleListInput().load({})
>>> print data, errors
{} 
{'items': [u'Missing data for required field.']}

たとえば、カスタム検証が必要な場合は、「アイテム」に空のリストを受け入れないでください。

from marshmallow import fields, Schema, validates, ValidationError

class SimpleListInput(Schema):
    items = fields.List(fields.String(), required=True)

    @validates('items')
    def validate_length(self, value):
        if len(value) < 1:
            raise ValidationError('Quantity must be greater than 0.') 

それで...

>>> data, errors = SimpleListInput().load({'items':[]})
>>> print data, errors
{'items': []} 
{'items': ['Quantity must be greater than 0.']}

検証をご覧ください

アップデート:

@Turnが以下にコメントしたように。あなたはこれを行うことができます:

from marshmallow import fields, Schema, validate

class SimpleListInput(Schema):        
    items = fields.List(fields.String(), required=True, validate=validate.Length(min=1))
于 2016-09-29T01:48:07.943 に答える