【发布时间】:2016-12-09 09:00:06
【问题描述】:
我正在用 Django 编写一个小型网络游戏。每场比赛有两名球员。为了管理游戏和参与者,我有这样的东西(非常简化):
class GamesQuerySet(models.query.QuerySet):
def with_player(self, user):
"""Games with |user| participating"""
return self.filter(players__player=user)
class Game(models.Model):
"""All the games"""
name = models.CharField(max_length=100, blank=True)
objects = GamesQuerySet.as_manager()
class PlayerInGame(models.Model):
"""Players participating in games"""
game = models.ForeignKey('Game', related_name='players')
player = models.ForeignKey('auth.User')
class Meta:
unique_together = ('game', 'player')
所以我可以轻松查询当前玩家参与的游戏:
Games.objects.with_player(user)
但要显示在游戏列表视图中,我还想包括其他玩家的姓名。
我尝试了一些事情,似乎可以通过添加 .extra() 和一些原始 SQL 来做到这一点,但我想尽量避免这种情况。
我尝试过使用类似这样的注释:
def add_other_player(self, user):
return self.annotate(other_player=PlayerInGame.objects.all(). \
filter(~Q(player=user)))
但运气不佳。还研究了fetch_related 和select_related。这样做的正确方法是什么?
【问题讨论】:
-
我不确定我是否理解了这个问题,您正在寻找一种让游戏的所有玩家都参与其中的方法吗?或者您正在寻找一种方法来找到有两个特定玩家的游戏?
标签: django django-models foreign-keys django-queryset reverse