ご覧いただきありがとうございます。
目標:
つまり、単一のビューから変更があった場合にのみ、django ユーザー オブジェクトとカスタム ユーザー プロファイル オブジェクトを更新します。
問題:
手始めに、このようなことをやろうとするのはこれが初めてなので、本当に単純なことかもしれませんが、見落としているだけです。
検証ステップで失敗しているようで、現在のユーザーのユーザー名を変更する変更を送信していない場合でも、「ユーザー名は一意である必要があります」という HTTP 400 エラーが発生します。これでおそらく、django-rest-auth に組み込まれているビューを使用してユーザー部分だけを更新し、プロファイルのみを更新するカスタム ビューを作成することができます。しかし、それはハックでばかげているように思えますが、それが道であるなら、私はそうします。
私が試したこと:
- プットとパッチの両方を試しました。同じ結果です。
- put メソッドと patch メソッドをオーバーライドして
request.data
、同じ場合は検証前にユーザー名フィールドを削除しようとしましたが、それが必要であるという別のエラーが発生しました。 - シリアライザーで更新メソッドをオーバーライドしようとしましたが、ネストされたフィールドを更新する方法がわからないという問題が発生しました。
- 終わりのないグーグル。
- カスタムバリデーターの作成を検討しました。しかし、どこから始めればよいかわかりません。これをできるだけシンプルにして、組み込みのものを好むようにしたかったのです。
シリアライザー:
class UserSerializer(ModelSerializer):
class Meta(UserDetailsSerializer.Meta):
model = User
fields = ('username', 'email', 'first_name', 'last_name')
read_only_fields = ('email', )
class UserProfileSerializer(ModelSerializer):
user = UserSerializer(required=True, many=False)
games = UserGameProfileSerializer(required=False, many=True)
class Meta:
model = UserProfile
fields = ('premium', 'user', 'games')
意見:
class UserProfileUpdateView(generics.UpdateAPIView):
# authentication_classes = (authentication.TokenAuthentication,)
# permission_classes = (permissions.IsAuthenticated,)
serializer_class = UserProfileSerializer
def get_queryset(self):
return UserProfile.objects.filter(user__username__exact=self.request.user).all()
def get_object(self):
return UserProfile.objects.filter(user__username__exact=self.request.user).get()