【发布时间】:2022-07-25 21:46:36
【问题描述】:
我正在尝试实现更新用户功能,但每当我尝试更新用户时,我都会返回 IntegrityError:UNIQUE 约束失败: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 行被捕获(在 updateUserProfile 函数中的 const {data} 处)。我已经读到,当您尝试使用相同的凭据(用户名或电子邮件)创建新用户时,可能会发生此错误,但在我的情况下,我正在发送一个 put 请求,但我不明白为什么会收到此错误.
【问题讨论】:
-
在您的数据库中,您已经有用户名为
data['email']的用户 -
@BartoszStasiak 我试图从视图中注释掉 user.username 以查看它是否可以工作,然后我尝试注释掉 user.email,最终都出现了同样的错误。