У меня есть форма на моем веб-интерфейсе, где пользователь может обновлять некоторую информацию - часть полей должна обновлять модель по умолчанию 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
. Что мне нужно изменить, чтобы сделать эту работу?