web-dev-qa-db-ja.com

Django Rest Frameworkがモデルレベルの検証を思いとどまらせるのはなぜですか?

Django Rest Frameworkシリアライザーは、モデルシリアライザーを検証するときに_Model.clean_を呼び出しません。与えられた説明は、これが「関心の分離をよりクリーンにする」ことにつながるということです Django Rest Framework 3.0リリースノートから

ModelSerializer検証とModelFormの違い。

この変更は、モデルインスタンスで.full_clean()メソッドを使用しなくなり、代わりにシリアライザーですべての検証を明示的に実行することも意味します。これにより、より明確な分離が可能になり、通常のSerializerクラスでも簡単に複製できないModelSerializerクラスでの自動検証動作がなくなります。

しかし、whatの懸念は、Django Rest Frameworkの作成者が分離しようとしていますか?


私の推測では、モデルインスタンスはそれ自体の妥当性について心配するべきではないと彼らは言っていると思います。もしそうなら、私は理由がわかりません。

33
Rollo

モデルの「full_clean」には2つの大きな問題があります。最初のものは技術的です。 full_cleanがまったく呼び出されない場合がいくつかあります。たとえば、queryset.update()を実行するときにバイパスします。

2つ目は、複雑なビジネスロジックがある場合(通常はfull_cleanを使用する理由です)、検証するモデルに行くのではなく、ビジネスロジックで検証を行う必要がある可能性が高いということです。各レイヤーは独自の一貫性を担当する必要があり、ストレージレイヤー(つまりモデル)はビジネスレイヤーを気にする必要はありません。

私が考えることができるもう1つのことは、シリアライザーが検証を行った後に来るモデルがあると、full_cleanが呼び出されるということです。この時点で、オブジェクトの作成を間に挟んだ2段階の検証があるため、状況が乱雑になり始めます。ネストされたシリアライザーを使用している場合、プライマリモデルが保存される前にネストされたモデルを作成できないため、ここでスタックする可能性があります。これにより、完全なクリーンコールがさらに厄介になります。一部のオブジェクトは作成され、他のオブジェクトは作成されません。 。 full_cleanを使用していつ、どのオブジェクトを検証する必要があるかを判断するのは困難です。ユーザーがupdate/cleanをオーバーライドして、full_cleanが呼び出されていないことを確認すると、ユーザーから多くの苦情が寄せられることは間違いありません。すべてのモデル。これは完全な頭痛の種になり始め、私たちは物事をより単純でより明確に保つことを好みます。

14
Linovia