IntegrityError в /api/users/profile/update
Я пытаюсь реализовать функциональность обновления пользователя, но всякий раз, когда я пытаюсь обновить пользователя, я получаю ошибку IntegrityError, говорящую: UNIQUE constraint failed: auth_user.username
Вот что у меня есть на данный момент:
Вот мои сериализаторы для пользователя:
class UserSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField(read_only=True)
_id = serializers.SerializerMethodField(read_only=True)
isAdmin = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'username', 'email', 'name', 'isAdmin']
def get__id(self, obj):
return obj.id
def get_isAdmin(self, obj):
return obj.is_staff
def get_name(self, obj):
name = obj.first_name
if name == '':
name = obj.email
return name
class UserSerializerWithToken(UserSerializer):
token = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'username', 'email', 'name', 'isAdmin', 'token']
def get_token(self, obj):
token = RefreshToken.for_user(obj)
return str(token.access_token)
Вот мой метод просмотра:
@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def updateUserProfile(request):
user = request.user
serializer = UserSerializerWithToken(user, many=False)
data = request.data
user.first_name = data['name']
user.username = data['email']
user.email = data['email']
if data['password'] != '':
user.password = make_password(data['password'])
user.save()
return Response(serializer.data)
А это мое действие пользователя:
export const updateUserProfile = (user) => async (dispatch, getState) => {
try {
dispatch({
type: USER_UPDATE_PROFILE_REQUEST,
});
const {
userLogin: { userInfo },
} = getState();
const config = {
headers: {
"Content-type": "application/json",
Authorization: `Bearer ${userInfo.access}`,
},
};
const { data } = await axios.put(`/api/users/profile/update`, user, config);
dispatch({
type: USER_UPDATE_PROFILE_SUCCESS,
payload: data,
});
dispatch({
type: USER_LOGIN_SUCCESS,
payload: data,
});
localStorage.setItem("userInfo", JSON.stringify(data));
} catch (error) {
dispatch({
type: USER_UPDATE_PROFILE_FAIL,
payload:
error.response && error.response.data.detail
? error.response.data.detail
: error.message,
});
}
};
При проверке Google Chrome говорится, что ошибка возникает в строке 142 (в const {data} в функции updateUserProfile). Я читал, что эта ошибка может произойти, когда вы пытаетесь создать нового пользователя с теми же учетными данными (имя пользователя или email), но в моем случае я посылаю запрос put и не могу понять, почему я получаю эту ошибку.
Почему вы не можете добавить функцию full_clean для проверки перед сохранением,
def save(self, *args, **kwargs):
self.full_clean()
return super(UserModel, self).save(*args, **kwargs)
если вы используете модель пользователя по умолчанию, то можете использовать эту проверку в обработчике сигнала перед сохранением, чтобы он любезно завершался в случае проверки уникального ограничения.
@receiver(pre_save)
def pre_save_handler(sender, instance, *args, **kwargs):
instance.full_clean()