0

phone,profile_photofirst_namelast_nameemailなどのDjangoデフォルトユーザーモデルのフィールドがあり、これらのフィールドの一部を更新しようとしているUserProfileモデルがあります。DjangoのRFでDjangoのユーザーモデルにパッチを当てるには?

models.py

class UserProfile(models.Model): 
    user = models.ForeignKey(User, verbose_name="User") 
    phone = models.CharField(max_length=16, verbose_name="Phone") 
    profile_photo = models.ImageField(null=True, blank=True, upload_to=user_directory_path, verbose_name="Profile Photo") 

serializers.py

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('url', 'first_name', 'last_name', 'email') 

class UserProfileSerializer(serializers.ModelSerializer): 
    user = UserSerializer(partial=True) 

    class Meta: 
     model = UserProfile 
     fields = '__all__' 

    def create(self, validated_data): 
     user_profile = UserProfile.objects.create(**validated_data) 
     return user_profile 

views.py

class UserProfileViewSet(viewsets.ModelViewSet): 
    queryset = UserProfile.objects.all() 
    serializer_class = UserProfileSerializer 
    authentication_classes = (TokenAuthentication,) 

    @detail_route(methods=['PATCH'], url_path='update-partial') 
    def user_profile_update_partial(self, request, pk=None): 
     profile = UserProfile.objects.get(id=pk) 
     serializer = self.get_serializer(profile, data=request.data, partial=True) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_202_ACCEPTED) 
     else: 
      return Response(status=status.HTTP_400_BAD_REQUEST) 

私は0123を送信する場合、phonefirst_nameまたはlast_nameのデータ@detail_route電話番号とプロフィール写真フィールドのみを更新できます。また、profile_photoデータが送信されないときに、Bad Requestエラーが発生する。

メソッドでpartial_updateを実装するにはどうすればよいですか?

答えて

2
class UserProfileViewSet(viewsets.ModelViewSet): 
    queryset = UserProfile.objects.all() 
    serializer_class = UserProfileSerializer 
    authentication_classes = (TokenAuthentication,) 

    def partial_update(self, request, *args, **kwargs): 
     profile = self.get_object() 
     serializer = self.get_serializer(profile, data=request.data, partial=True) 
     if serializer.is_valid(): 
      user_serializer = UserSerializer(profile.user, data=request.data, partial=True) 
      if user_serializer.is_valid(): 
       user_serializer.save() 
       serializer.save() 
       return Response(serializer.data, status=status.HTTP_202_ACCEPTED) 
      else: 
       return Response(data=user_serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
     else: 
      return Response(data=serializer.errors,status=status.HTTP_400_BAD_REQUEST) 

1:PATCHの実装方法は?

A1:オーバーライドpartial_updateメソッド。

Q2:first_nameまたはlast_nameを更新するにはどうすればよいですか?

A2:。迅速な対応のための

+0

感謝を(パスワードを更新したい場合は、前にエンコードされたパスワードを作成し、データベースに生のパスワードを保存するmake_passwordメソッドを使用して必要があります)UserSerializerをという名前の別のシリアライザでそれを更新します。実際に私は[djangoのネストされたフィールドを扱う](http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects)でこの問題を解決しました。しかし、今はImageFieldモデルフィールドの更新に問題があります。エラーは: '送信されたデータはファイルではありませんでした。フォームのエンコーディングタイプを確認してください.' – bullception

関連する問題