Обновление пользователя и расширенного профиля пользователя в одном вызове API в Django Rest Framework - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть форма на моем веб-интерфейсе, где пользователь может обновлять некоторую информацию - часть полей должна обновлять модель по умолчанию Django User, в то время как другие должны обновлять модель User Profile, которая имеет единицу -To-One Отношения с пользователем.

Я выполняю код ниже, но получаю следующую ошибку:

AttributeError: 'str' object has no attribute '_meta'

api.py

# Get and Update User API
class UserAPI(generics.RetrieveUpdateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = UserSerializer

    def retrieve(self, request, *args, **kwargs):
        serializer = self.serializer_class(request.user)
        return Response(serializer.data)

    def update(self, request, *args, **kwargs):
        user_data = request.data['user']
        profile_data = request.data['profile']
        user_serializer = self.serializer_class(request.user, data=user_data, partial=True)
        user_serializer.is_valid(raise_exception=True)
        user_serializer.save()

        if profile_data:
            profile_serializer_class = ProfileSerializer
            profile_serializer = ProfileSerializer(request.user.username, data=profile_data, partial=True)
            print(profile_serializer)
            profile_serializer.is_valid(raise_exception=True)
            profile_serializer.save()

        response = {'user': user_serializer.data, 'profile': profile_serializer.data}
        return Response(response)

# UserProfile API
class ProfileAPI(generics.RetrieveAPIView):
    lookup_field = 'user'
    serializer_class = ProfileSerializer
    queryset = Profile.objects.all()

serializers.py

# User Serializer
class UserSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = ('id', 'username', 'email', 'first_name', 'last_name')

# Profile Serializer
class ProfileSerializer(serializers.ModelSerializer):
  user = serializers.SlugRelatedField(read_only=True, slug_field="username")
  class Meta:
    model = Profile
    fields = '__all__'

Я делаю запрос на исправление в следующем формате:

{
    "user": {
        "username": "testuser"
    },
    "profile": {
        "bio": "hello this is my bio"
    }
}

Исправление работал, когда я только обновлял модель User, однако я не уверен, что это правильный способ включить модель Profile. Что мне нужно изменить, чтобы сделать эту работу?

1 Ответ

0 голосов
/ 26 апреля 2020

Первый позиционный аргумент Serializer и его подклассы должны быть экземпляром , который вы хотите сериализовать, создать или обновить . В случае ModelSerializer это экземпляр модели.

Поэтому вы должны передать экземпляр Profile. Я предполагаю, что это user.profile

    profile_serializer = ProfileSerializer(request.user.profile, data=profile_data, partial=True)
...