2016-05-15 15 views
3

marshmallowを使用してリストを検証できますか?marshmallowを使用してリストを検証できますか?

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']) 

か、オブジェクトだけを検証するために期待されていますか?

+0

問題があります辞書に反復しているかもしれません*あなたに文字列を与えます;キーが例えばの辞書を渡すとどうなりますか?整数? – jonrsharpe

+0

'errors'の値をチェックしていますか?あなたの例を試してみると、適切な値に設定されているようです。 – larsks

答えて

0

SimpleListInputは、「items」というプロパティを持つクラスです。プロパティ "items"は誰が文字列のリストを受け入れるかです。

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

Validationを見てみましょう...そして、

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':['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.']} 

、例えば、 "項目" で空のリストを受け入れません

4

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

例:

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

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

しかし、それはまだマシュマロは、トップレベルの非オブジェクトのリストを使用してサポートしていない、オブジェクトスキーマである必要があります。非オブジェクト型のトップレベルのリストを検証する必要がある場合は、タイプのリストフィールドを1つ使用してスキームを定義し、ペイロードをオブジェクトのようにラップするだけです。

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

payload = ['foo', 'bar'] 
data, errors = SimpleListInput().load({'items': payload}) 
関連する問題