2016-10-18 1 views
3

私は、Django REST Frameworkと通常のフォームインターフェイスの両方からアクセス可能なモデルを持つDjangoアプリケーションを持っています。フォームインターフェイスには、モデルへの変更を保存する前にいくつかの妥当性チェックがありますが、特殊なDjangoフレームワークを使用するのではなく、ビューの単純なローカル変更だけです。別のフィールドの値に基づいてDjangoモデルフィールドを検証していますか?

フォームとREST呼び出しに同じ検証を適用したいので、検証をモデルに移したいと思います。フィールドのバリデーターフィールドを使用して単純なケースでそれを行う方法を見ることができますが、私は名前/タイプ/値モデルを持っています。バリデーターは、フィールドがあるモデルに関する情報を送信しないので、他のフィールドにアクセスすることはできません。

フォームのDRFとPOSTビューのシリアライザで本質的に同じコードを使用することなく、この検証を実行するにはどうすればよいですか?

答えて

1

それは次のように定義されている場合、他のフィールドに関する情報を送信されませんごとのフィールド検証:

def validate(self, data): 
    ... 
:あなたはこのように定義されたメソッドを持っている場合、

def validate_myfield(self, value): 
    ... 

しかし、

次に、dict内のすべてのデータを取得し、クロスフィールド検証を行うことができます。

+0

どのオブジェクトにありますか? Modelベースのクラスではそういうことはありません。 – AnotherHowie

+0

この回答は、DRFの 'ModelSerializer'サブクラスのコンテキストにあります。 Djangoモデルには 'clean_myfield'と' clean'メソッドの類似した状況があります。あなたはDRF経由でポストしているのですか? – wim

+0

はい、いいえ。私はDRF APIを持っていますが、フォームが投稿するビューもあります。 – AnotherHowie

2

クロスフィールド検証にはrequiredパッケージを使用できます。 Pythonで宣言的に検証ルールを表現することができます。

class MySerializer(serializers.Serializer): 

    REQUIREMENTS = (
     Requires("end_date", "start_date") + 
     Requires("end_date", R("end_date") > R("start_date")) + 
     Requires("end_date", R("end_date") < today.date() + one_year) + 
     Requires("start_date", R("start_date") < today.date() + one_year) 
    ) 

    start_date = serializers.DateField(required=False, null=True, blank=True) 
    end_date = serializers.DateField(required=False, null=True, blank=True) 

    def validate(self, data): 
     self.REQUIREMENTS.validate(data) # handle validation error 

あなたはあなたのモデルにREQUIREMENTSを入れて、あなたのDRFとDjangoフォームの両方がそれを使用してデータを検証するかもしれない:あなたは、DRFと、このような何かを持っているでしょう。

Hereは、ブログ記事の詳細説明です

関連する問題