2017-12-14 8 views
0

1つのフィールドの存在が他のフィールドの長さに依存する文書を検証する方法はありますか? 私の試み:ケルベロスの他のフィールドの長さに応じて、フィールドを検証するにはどうすればよいですか?

import cerberus 

schema = { 
    'field_2': { 
     'type': 'integer', 
     'dependencies': { 
      'field_1': {'maxlength': 1} 
     } 
    }, 
    'field_1': { 
     'type': 'list', 
    } 
} 
v = cerberus.Validator(schema) 
doc = { 
    'field_1': [1, ], 
    'field_2': 77 
} 
if not v.validate(doc): 
    print(v.errors) 
else: 
    print(True) 

出力:

{'field_2': ["depends on these values: {'field_1': {'maxlength': 1}}"]} 

期待出力されTrue

答えて

1

from typing import Optional, Any, Tuple 

from cerberus import Validator 


class ExtendedValidator(Validator): 
    def _validate_with_length(self, with_length, field, _value): 
     # type: (Tuple[str, int], str, Any) -> Optional[bool] 
     """Validating in dependence of length of other field in document 

     The rule's arguments are validated against this schema: 
     {'type': 'list'} 
     """ 
     key, length = with_length 
     if key not in self.document: 
      return False 
     if len(self.document[key]) != length: 
      self._error(field, "Length of %s must be %s" % (key, length)) 


schema = { 
    'field_2': { 
     'type': 'integer', 
     'with_length': ('field_1', 1), 
    }, 
    'field_1': { 
     'type': 'list', 
    } 
} 

docs = [{'field_1': [1, ], 'field_2': 77}, {'field_1': [1, 2], 'field_2': 77}] 
v = ExtendedValidator(schema) 
for doc in docs: 
    if not v.validate(doc): 
     print(v.errors) 
    else: 
     print(True) 

出力:

True 
{'field_2': ['Length of field_1 must be 1']} 
0

メイクセンス? 'maxlength': 1field_1に移動してください。それはcustom rulesを使用して行うことができる

schema = { 
    'field_2': { 
     'type': 'integer', 
     'dependencies': 'field_1' 
    }, 
    'field_1': { 
     'type': 'list', 
     'maxlength': 1 
    } 
} 
+0

残念ながら、 'field_1'を長くすることができますが、' ==(FIELD_1)をlenの場合のみ、1 ' 、 'field_2'を使うことができます –

関連する問題