2013-08-28 16 views
6

別のフィールドを参照する必要があるシリアライザで、カスタムフィールドレベルの検証を実行しています。Django REST Framework:実際にvalidate_ <fieldname>との違いは何ですか?

Validation documentationの例を見ると、validate_<fieldname>validateのどちらを使用すべきかはっきりしません。両方ともattrsという辞書があるようですので、validateの説明では複数のフィールドにアクセスする必要があることを示していますが、validateから別のフィールドを簡単に参照することもできます。validate_<fieldname>だから両方のオプションはなぜですか?私の場合、どのオプションを使用するのが正しいですか?

答えて

17

ValidationErrorvalidate_<foo>()にすると、フィールドエラーが発生します。

{'foo': ['Not a fooish value.']} 

validate()内部ValidationErrorを上げると非フィールドエラーになります。

{'non_field_errors': ['Foo and bar are not compatible.']} 

、なぜ両方のオプションがありますか?

これは部分的にシリアライザAPIが可能な限りDjangoのフォームAPIを反映しているためです。必要に応じていくつかの違いがありますが、validatevalidate_<foo>のスタイルは似ています。

私の場合、どのオプションを使用するのが適切ですか?

エラーメッセージがより適切であるかどうかに基づいて判定を行います。

+2

Neil - 'attrs'は、完全な本物のオブジェクトインスタンスに検証され復元される前に、シリアライザが辞書として入力するものです。私の頭の上から離れて、私はそれがあなたがそれにアクセスしている時点ですでに検証されている入力のいくつかと関係しているかもしれないと思います。 –

+0

ありがとう@Tom。 validate_fooに追加のパラメータを渡す方法はありますか?たとえば、オブジェクトのIDですか? – Neil

+1

更新の場合、 'self.object'はインスタンスへの参照を保持します。 –

関連する問題