用户拥有对象的查询集对象

问题描述 投票:0回答:1

应用程序有游戏模型和玩家模型。

## 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 对象?

python-3.x django
1个回答
0
投票

这是我想出的答案:

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
© www.soinside.com 2019 - 2024. All rights reserved.