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
相关产品推荐
相关产品推荐

