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

如何获取登录用户拥有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:27:41