应用程序有游戏模型和玩家模型。
## PLAYER MODEL
class Player(models.Model):
owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
art = models.URLField(max_length=150)
## GAME MODEL
# This is the Game model.
class Game(models.Model):
this_id = models.AutoField(primary_key=True)
player1 = models.ForeignKey('Player', on_delete=models.SET_NULL, related_name='player1', null=True, blank=True)
player2 = models.ForeignKey('Player', on_delete=models.SET_NULL, related_name='player2', null=True, blank=True)
player3 = models.ForeignKey('Player', on_delete=models.SET_NULL, related_name='player3', null=True, blank=True)
p1_final_points = models.PositiveIntegerField(default=0)
p2_final_points = models.PositiveIntegerField(default=0)
p3_final_points = models.PositiveIntegerField(default=0)
genre = models.CharField(max_length=7, default='')
### is the game completed
completed = models.BooleanField(default=False)
我想获取登录用户拥有玩家的游戏对象的列表。这是为了在仪表板中显示用户的游戏历史记录,以便他们可以看到过去的游戏。
此代码获取所有 Game 对象。所以它显示了每个用户的历史记录。
class DashboardListView(generic.ListView):
model = Game
template_name = 'dashboard.html'
context_object_name = 'tournament_list'
def get_queryset(self):
return Game.objects.filter()
我可以将范围缩小到每个玩家已完成的游戏,如下所示:
class DashboardListView(generic.ListView):
model = Game
template_name = 'dashboard.html'
context_object_name = 'tournament_list'
def get_queryset(self):
return Game.objects.filter(completed=True)
我尝试将范围缩小到仅特定用户的游戏:
def get_queryset(self):
if Player.objects.filter(owner=self.request.user).exists():
mine = Player.objects.filter(owner=self.request.user).get()
return Game.objects.filter(
Q(player1=mine) | Q(player2=mine) | Q(player3=mine) & Q(completed=True))
但是因为用户有多个 Player 对象,所以会抛出此错误:
get() returned more than one Player -- it returned 12!
我想要的是用户拥有这 12 个 Player 对象的 12 个游戏。
如何获取用户拥有 Player 对象的 Game 对象?
这是我想出的答案:
def get_queryset(self):
q = set()
if Player.objects.filter(owner=self.request.user).exists():
for i in Player.objects.filter(owner=self.request.user):
mine = i
for p in Game.objects.filter((Q(player1=mine) | Q(player2=mine) | Q(player3=mine)) & Q(completed=True)):
q.add(p)
return q