4

そのため、スキーマの検証にCerberusを使用していますが、キーが不明な辞書のサブディクショナリを検証する際に特定の問題に遭遇しています。

たとえば、次のドキュメントがあるとします。

dict = {
   'things': {
       '0463': {
           'foo': 'blah',
           'bar': 'bleep'
        },
        '0464': {
           'foo': 'x',
           'bar': 'y'
        },
        'another_random_id': {
           'foo': 'blah',
           'bar': 'bleep'
        }
}

fooしたがって、サブディクショナリが特定の構造 (およびキーとして) を持っていることを検証したいのですが、事前barにキーを知らずにこれを検証する方法がわかりません (私の場合はランダム ID です。これはvalueschema の適切な使用方法ですが、valueschema を 'dict' 型の何かで動作させることができないようです. ケルベロスで次のスキーマを設定しようとしました:

schema = {
    'things': {
        'type': 'dict',
        'valueschema': {
             'type': 'dict',
             'foo': {'type': 'string'},
             'bar': {'type': 'string'}
         }
     }
}

スキーマの定義が間違っているのでしょうか、それとも の現在の実装では不可能valueschemaですか? を使用するリポジトリでいくつかのテストを見ましたが、それらは の型が int または stringvalueschemaである場所のみをテストしていました。valueschema

4

1 に答える 1

4

そのため、キーの後にフィールドを配置するとvalueschema、それがタイプの場合、ケルベロスが処理することがわかりました。したがって、私の構造は次のようになります。dictschemavalueschema

schema = {
    'things': {
        'type': 'dict',
        'valueschema': {
             'type': 'dict',
             'schema':{
                 'foo': {'type': 'string'},
                 'bar': {'type': 'string'}
             }
         }
     }
}

valueschematype の値を検証することを期待して設計されたようには見えないため、まだ奇妙な点がありますdict。たとえば、バリデーターから拡張する場合、スキーマを呼び出すときにパラメーターを渡さないため、検証が通常のスキーマの場合と同じように動作するvalidate_valueschemaようにメソッドをオーバーライドする必要がありました。したがって、私のオーバーライドは次のようになります。requiredvalidateupdatevalidate_valueschema

def _validate_valueschema(self, schema, field, value):
    if isinstance(value, Mapping):
        for key, document in value.items():
            validator = self._Validator__get_child_validator()
            validator.validate(
                {key: document}, {key: schema}, 
                context=self.document, update=self.update)
            if len(validator.errors):
                self._error(field, validator.errors)

update=self.update追加したのはこれだけです。

于 2016-06-08T15:20:41.927 に答える