【问题标题】:IntegrityError at /api/users/profile/update/api/users/profile/update 处的 IntegrityError
【发布时间】: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,最终都出现了同样的错误。

标签: python reactjs django


【解决方案1】:

为什么不能在保存前添加一个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()

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 2013-11-11
    • 2018-09-27
    • 1970-01-01
    • 2022-12-12
    • 2018-02-27
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多