You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework关注接口无法保存关联关系问题求助

问题分析与解决

你遇到的问题是调用关注接口返回成功,但数据库中未保存关注关系,可能由以下几个原因导致,对应解决方案如下:

1. 移除无意义的save()调用

ManyToMany字段的add()方法会自动将关系保存到中间表,无需额外调用user_profile.save(),虽然这不会直接引发错误,但移除该代码可以避免逻辑混淆。

2. 增加重复关注检查

如果当前用户已经关注了目标Profile,add()方法不会执行任何操作也不会抛出异常,导致你误以为保存成功但数据库无变化。可以在添加前增加检查逻辑:

def post(self, request, pk):
    user_profile = get_object_or_404(Profile, pk=pk)
    user = request.user
    if user_profile.user == user:
        return Response({"error": "You cannot follow your own profile."}, status=status.HTTP_400_BAD_REQUEST)
    try:
        follower = get_object_or_404(Profile, user=user) 
        # 检查是否已关注
        if follower in user_profile.follower.all():
            return Response({"error": "You are already following this profile."}, status=status.HTTP_400_BAD_REQUEST)
        user_profile.follower.add(follower)
    except Exception as e:
        print(e)
        return Response({"error": "An error occurred while trying to follow this profile."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    return Response({"success": "You are now following this profile."}, status=status.HTTP_200_OK)

3. 确保模型已完成数据库迁移

ManyToMany关系依赖自动生成的中间表,执行以下命令完成迁移:

python manage.py makemigrations
python manage.py migrate

4. 检查URL参数匹配逻辑

如果你的URL中传递的pk是User的主键而非Profile的主键,get_object_or_404(Profile, pk=pk)会定位到错误的Profile(或因巧合匹配到无关Profile)。若需用User ID作为参数,修改查询逻辑:

user_profile = get_object_or_404(Profile, user__id=pk)

5. 新增调试逻辑验证关系

可以在add()后立即刷新对象并验证关系是否生效,用于排查深层问题:

user_profile.follower.add(follower)
# 从数据库重新获取数据验证
user_profile.refresh_from_db()
if follower not in user_profile.follower.all():
    return Response({"error": "Failed to save follow relationship."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

内容的提问来源于stack exchange,提问作者Alan Turing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:37:46