2016-04-29 9 views
0

したがって、/ user/1エンドポイントに対して次のようなパッチ要求があります。明らかに、 "sdfsdf"は私のUserモデルの有効な属性ではありません。私が次のパッチを当てると、200の応答が得られますが、 "sdfsdf"は有効なフィールドではないため、400または422が返されます。どのように悪いパッチを拒否するのですか?Django RESTは不正なPATCHデータを拒否します

{ 
    "sdfsdf": "sdfsdf" 
    "username": "alex" 
} 

私のユーザーシリアライザは、このようにlookes:

class UserSerializer(serializers.ModelSerializer): 
class Meta: 
    model = User 
    fields = ("first_name", "id", "username") 

私のユーザービューは、次のようになります。

class UserViewSet(viewsets.ViewSet): 
serializer_class = UserSerializer 

def list(self, request, pk=None): 
    queryset = User.objects.filter() 
    serializer = UserSerializer(queryset, many=True) 
    return Response(serializer.data) 

def retrieve(self, request, pk=None): 
    queryset = User.objects.filter() 
    user = get_object_or_404(queryset, pk=pk) 
    serializer = UserSerializer(user) 
    return Response(serializer.data) 

def partial_update(self, request, pk=None): 
    queryset = User.objects.filter() 
    user = get_object_or_404(queryset, pk=pk) 

    if not request.user.pk == user.pk: 
     raise PermissionDenied 

    serializer = UserSerializer(user, data=request.data, partial=True) 

    serializer.is_valid(raise_exception=True) 
    serializer.save() 
    return Response(serializer.data) 
+1

はたぶん、他は無視されますか?それを削除し、例外がスローされたかどうかを確認してください。 – basiljames

+0

サイコロがなく、私はそれを取り除きましたが、まだ200 – user1152226

答えて

0

あなたは(で続きを読むオブジェクトレベルの検証を提供するために、UserSerializer.validateメソッドをオーバーライドすることができますdocs)。例えば

:あなたは、特に[フィールドは=( "FIRST_NAME"、 "ID"、 "ユーザ名")]デシリアライズするためのフィールドを定義しているので、

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ("first_name", "id", "username") 

    def validate(self, data): 
     invalid_keys = set(self.initial_data.keys()) - set(self.fields.keys()) 
     if invalid_keys: 
      raise serializers.ValidationError('invalid keys passed into serializer: {0}'.format(invalid_keys)) 
     return data 
関連する問題