0

phone, profile_photofirst_name, last_name, email과 같은 장고 기본 사용자 모델의 일부 필드가 포함 된 UserProfile 모델이 있는데이 필드 중 일부를 업데이트하려고합니다.Django RF로 장고 사용자 모델에 패치하는 방법은 무엇입니까?

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을 보내는 경우, phone, first_name 또는 last_name 데이터는 @detail_route입니다. phone 및 profile_photo 필드 만 업데이트 할 수 있습니다. 또한 profile_photo 데이터가 전송되지 않을 때 잘못된 요청 오류가 발생합니다.

PATCH 방법으로 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) 

Q1 : 어떻게 PATCH 방법을 구현하는 방법?

A1 : 오버레이 partial_update 방법.

질문 2 : 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

관련 문제