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

Django中如何根据登录用户关联的Player查询对应Game对象

解决方案

1. 通过Q查询获取关联的Game对象

在视图里用Django的Q对象构建多条件过滤,直接找出当前用户的Player关联的所有Game:

先导入Q工具:

from django.db.models import Q

修改你的视图代码:

def upload(request):
    mine = Player.objects.get(owner=request.user)
    # 筛选出包含当前Player的所有Game
    user_games = Game.objects.filter(
        Q(player1=mine) | Q(player2=mine) | Q(player3=mine)
    )
    # 处理查询结果:根据业务逻辑,用户大概率只参与一个游戏
    try:
        current_game = user_games.get()
    except Game.DoesNotExist:
        current_game = None  # 用户还没加入任何游戏
    except Game.MultipleObjectsReturned:
        # 若存在多个游戏,按创建时间取最新的(需Game有created_at这类时间字段)
        current_game = user_games.latest('created_at')

    context = {
        'mine': mine,
        'current_game': current_game,
    }
    return render(request, '你的模板路径.html', context)

2. 模板中展示游戏及玩家状态

在模板里通过current_game对象判断各玩家字段是否填充,展示对应内容:

{% if current_game %}
    <h2>当前游戏房间</h2>
    <div class="player-list">
        <div class="player-item">
            {% if current_game.player1 %}
                <img src="{{ current_game.player1.art }}" alt="玩家1头像">
                <span>玩家1</span>
            {% else %}
                <span>等待玩家1加入</span>
            {% endif %}
        </div>
        <div class="player-item">
            {% if current_game.player2 %}
                <img src="{{ current_game.player2.art }}" alt="玩家2头像">
                <span>玩家2</span>
            {% else %}
                <span>等待玩家2加入</span>
            {% endif %}
        </div>
        <div class="player-item">
            {% if current_game.player3 %}
                <img src="{{ current_game.player3.art }}" alt="玩家3头像">
                <span>玩家3</span>
            {% else %}
                <span>等待玩家3加入</span>
            {% endif %}
        </div>
    </div>
{% else %}
    <p>你还未加入任何游戏</p>
{% endif %}

可选优化:简化模型关联

如果业务上每个Player只属于一个Game,可以给Player模型加一个指向Game的外键:

class Player(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    art = models.URLField()
    game = models.ForeignKey(Game, on_delete=models.SET_NULL, null=True, blank=True, related_name='players')

这样后续查询会更简单,直接通过mine.game就能拿到关联的Game,但需要同步修改创建Player和Game的视图逻辑,确保创建Player时设置对应的game字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:27