如何获取登录用户拥有Player对象的已完成Game实例列表?
解决方案
问题核心在于你用get()获取用户的Player对象,但一个用户可以拥有多个Player实例,get()只能返回单个对象,因此触发了多结果报错。下面是两种正确的查询逻辑:
方法一:用Q对象实现多条件OR查询
通过Django的Q对象,匹配Game中player1、player2、player3任意一个属于当前用户的Player,同时筛选已完成的游戏:
from django.db.models import Q from django.contrib.auth.decorators import login_required @login_required def user_game_history(request): # 获取当前用户的所有Player实例 user_players = request.user.player_set.all() # 筛选已完成且包含用户任意Player的游戏 completed_games = Game.objects.filter( completed=True, Q(player1__in=user_players) | Q(player2__in=user_players) | Q(player3__in=user_players) ) return render(request, 'dashboard.html', {'games': completed_games})
方法二:通过Player反向关联查询
利用Player模型到Game模型的反向关联(你定义的related_name),从用户的Player集合反向获取所有关联的Game,再筛选已完成状态:
from django.contrib.auth.decorators import login_required @login_required def user_game_history(request): # 从用户所有Player关联的Game中筛选已完成的 completed_games = Game.objects.filter( completed=True, id__in=request.user.player_set.values_list( 'player1__id', 'player2__id', 'player3__id' ).distinct() ) return render(request, 'dashboard.html', {'games': completed_games})
关键提示
- 避免在可能返回多个对象的查询中使用
get(),改用filter()或all() __in查询适合处理“匹配集合中任意一个对象”的场景,完美适配一个用户多Player的情况- Game模型中player字段允许为null的设置不会影响查询,系统会自动忽略null值的关联
内容的提问来源于stack exchange,提问作者postcardfiction
相关产品推荐
相关产品推荐

