1

ご覧いただきありがとうございます。

目標:

つまり、単一のビューから変更があった場合にのみ、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()
4

1 に答える 1