2016-08-04 13 views
2

UserへのForeignKeyを持つモデルManagerがあります。 荷主を更新するには、私は私がUserMeSerializeremailフィールド上でバリデータを追加するまで、これはすべての罰金働いていた{"user": {"first_name": "John", "last_name": "Doe", "email": "[email protected]"}Django Rest Frameworkのネストされたシリアライザによるシリアライザフィールドの検証

class CompanyManagerMeSerializer(serializers.ModelSerializer): 
    user = UserMeSerializer() 
    company = CompanyFullSerializer() 

    def update(self, instance, validated_data): 
     user_data = validated_data.pop('user', {}) 
     user = instance.user 
     for key, val in user_data.items(): 
      setattr(user, key, val) 
     user.save() 

     company_data = validated_data.pop('company', {}) 
     company = instance.company 
     for key, val in company_data.items(): 
      setattr(company, key, val) 
     company.save() 

     for key, val in validated_data.items(): 
      setattr(instance, key, val) 
     instance.save() 

     return instance 

    class Meta: 
     model = CompanyManager 
     fields = ("pk", "user", "company", "display_name") 
     read_only_fields = ("display_name",) 

のようなネストされたオブジェクトとPATCH方法を送信します。

class UserMeSerializer(serializers.ModelSerializer): 
    email = serializers.EmailField(
     validators=[UniqueValidator(
      queryset=User.objects.all(), 
      message=_("This email address is already used.") 
     )] 
    ) 

    class Meta: 
     model = User 
     fields = (
      'pk', 'first_name', 'last_name', 'username', 'email', 'date_joined', 'last_login' 
     ) 
     read_only_fields = ('pk', 'date_joined', 'last_login') 

UserMeSerializerがinstanceパラメータを取得しないため、検証は失敗します。ユニークなチェックでは、見つかった電子メールアドレスが確認中であることがわかりません。see the source of UniqueValidator

私の質問は、インスタンスで作業していることをUserMeSerializerにどのように伝えることができますか? is_validを上書きする必要がありますか?

答えて

-1

UniqueValidatorに拡張されたカスタムバリデーターを作成すると助かります。 コンテキストを確認し、それに応じてself.instanceを設定することができます。そのためにはset_context()メソッドを実装する必要があります。

関連する問題