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

