2017-06-28 2 views
4

私は管理者モジュールをデフォルトのDjangoユーザーモジュールから拡張しました。Django Restフレームワークバリデーターはextra_kwargs内で実行されません

Django Rest Frameworkでは、このモジュールのシリアライザをユーザ名と電子メールバリデータで作成します。

私がインライン化のバリデータを宣言するときにすべてがうまく行く:

class AdministratorCreateUpdateSerializer(ModelSerializer): 

    username = serializers.CharField(
     source='user.username', 
     validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
    email = serializers.EmailField(
     source='user.email', 
     validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
    password = serializers.CharField(
     source='user.password', 
     allow_blank=True, 
     style={'input_type': 'password'} 
    ) 
    first_name = serializers.CharField(
     source='user.first_name' 
    ) 
    last_name = serializers.CharField(
     source='user.last_name' 
    ) 

    class Meta: 
     model = Administrator 
     fields = [ 
      'username', 
      'email', 
      'password', 
      'first_name', 
      'last_name', 
     ] 

をしかし、私はextra_kwargsの内側にそれを宣言するときにバリデータが実行されない:

class AdministratorCreateUpdateSerializer(ModelSerializer): 

    username = serializers.CharField(
     source='user.username', 
    ) 
    email = serializers.EmailField(
     source='user.email', 
    ) 
    password = serializers.CharField(
     source='user.password', 
     allow_blank=True, 
     style={'input_type': 'password'} 
    ) 
    first_name = serializers.CharField(
     source='user.first_name' 
    ) 
    last_name = serializers.CharField(
     source='user.last_name' 
    ) 

    class Meta: 
     model = Administrator 
     fields = [ 
      'username', 
      'email', 
      'password', 
      'first_name', 
      'last_name', 
     ] 
     extra_kwargs = { 
      'username': { 
       'validators': [UniqueValidator(queryset=User.objects.all())] 
      }, 
      'email': { 
       'validators': [UniqueValidator(queryset=User.objects.all())] 
      }, 
     } 

追加フィールドを定義する場合、この問題はsourceを使用してから来るんまたは、他の何か?

+0

場合、印刷の出力(のrepr(AdministratorCreateUpdateSerializerを()))を印刷して参照してみてくださいフィールド内にバリデーターがあります –

答えて

4

extra_kwargsシリアライザで明示的に宣言されているフィールドでは機能しません。 read_only_fieldsの場合と同じですが、extra_kwargsに渡されます。明示的に宣言された各フィールドは、コンストラクタ引数の残りにextra_kwargsが追加されたときに単純に省略されます。

これはドキュメントではっきりと指摘する必要がありますが、そうではありません。

議論:https://github.com/encode/django-rest-framework/issues/3460

コード:https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py#L1007

ので、あなたの最初のソリューションが唯一の適切なソリューションです:)

+0

あなたの説明にもう1つ追加されているのは、https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py#L1275です。これは最初のコードが動作する理由を説明する行です –

関連する問題