現在django-rest-frameworkで、patch処理のオーバーライドを行っています。
やりたいこととしては、requestで送られてきたpasswordを元のデータのpasswordと照合して、一致していた場合にpassword以外のfieldを更新するということを行いたいです。
リクエスト
curl -v -X PATCH "http://localhost:8000/api/xxx" -H "Authorization: Bearer jwtトークン" -d name=xxxxxxxx -d password=00000000
上記の場合で、nameのみ更新をしたいです(passwordは更新しない)(他のfieldが空の場合はデータは維持)
しかしpasswordも更新されてしまい手詰まりの状況です。
check_passwordでパスワードが一致してるまでは確認しております。(True)
views.py
class View(GenericAPIView): serializer_class = SampleSerializer def patch(self, request): user = self.request.user serializer = SampleSerializer(request.user, data=request.data, partial=True) serializer.is_valid() user.check_password(serializer.validated_data['password']) serializer.save() return Response(status=status.HTTP_200_OK)
serialiser.py
class SampleSerializer(serializers.ModelSerializer): class Meta: model = Sample exclude = [ 'is_superuser', 'last_login', 'groups', 'user_permissions', 'created_at', 'updated_at' ] extra_kwargs = { 'password': { 'write_only': True } } def create(self, validated_data): return Sample.objects.create_user(**validated_data) def update(self, instance, validated_data): sample = Sample.objects.get(pk=instance.id) Sample.objects.filter(pk=instance.id).update(**validated_data) return sample def __init__(self, *args, **kwargs): kwargs['partial'] = True super(SampleSerializer, self).__init__(*args, **kwargs)
やったこと
serializer.save()のところにupdate_fields(必要カラム)を記述したのですが、
django.core.exceptions.FieldDoesNotExist: Sample has no field named 'update_fields'
と怒られてしまいました、、、
初学者のため、色々おかしい部分もあると思いますが、ご教示いただけたら幸いです。何卒よろしくお願いいたします。
あなたの回答
tips
プレビュー