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

Django好友功能报错:get()返回多个Friend实例(返回2个)

解决Django好友功能中get() returned more than one Friend的报错

这个报错的核心原因很明确:你的数据库里存在多个Friend实例对应同一个current_user,而Friend.objects.get(current_user=request.user)要求必须返回且仅返回一条记录,当查到多条时就会触发这个异常。下面分两步帮你解决问题:

1. 修复模型设计(根源解决)

你的Friend模型目前没有限制current_user的唯一性,导致同一个用户可能被创建多个Friend实例。首先修改models.py,给current_user添加unique=True约束:

class Friend(models.Model):
    users = models.ManyToManyField(User)
    # 添加unique=True确保每个用户只有一个Friend实例
    current_user = models.ForeignKey(User, related_name='all', null=True, unique=True)

修改后别忘了执行数据库迁移命令:

python manage.py makemigrations
python manage.py migrate

如果你觉得当前的模型设计不够直观(比如用ManyToMany存储好友列表的方式不够清晰),也可以重构为更常见的好友关系模型,区分好友请求和已通过状态:

class Friend(models.Model):
    from_user = models.ForeignKey(User, related_name='friend_requests_sent')
    to_user = models.ForeignKey(User, related_name='friend_requests_received')
    is_accepted = models.BooleanField(default=False)

    class Meta:
        # 确保同一个用户不能重复向另一个用户发送请求
        unique_together = ('from_user', 'to_user')

2. 修复视图逻辑

原来的视图中直接用get()获取Friend实例,没有处理实例不存在或存在多个的情况。改用get_or_create()方法,它会自动获取现有实例,若不存在则创建新的,同时结合上面的模型约束,就能避免重复实例的问题:

def change_friends(request, pk):
    new_friend = User.objects.get(pk=pk)
    # 获取或创建当前用户的唯一Friend实例
    data, created = Friend.objects.get_or_create(current_user=request.user)
    frnds = data.users.all()
    
    if new_friend in frnds:
        data.users.remove(new_friend)
    else:
        data.users.add(new_friend)
    
    # 记得添加重定向或响应,比如回到好友列表页
    return redirect('your-friend-list-url-name')

这样修改后,既解决了多实例导致的get()异常,也处理了用户首次添加好友时没有Friend实例的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:03:23