【问题标题】:Django queryset filtering out objects with common membersDjango 查询集过滤掉具有共同成员的对象
【发布时间】:2020-10-21 15:58:12
【问题描述】:

我正在创建两步表单。在第一部分,队长正在选择他的一个团队,第二部分我从第一步中检索选择的团队并基于它创建查询集。第二种形式应该只过滤与第一步没有共同球员的球队。每支球队只有 3 名球员。

class Team(models.Model):
    name = models.CharField(max_length=200, null=True, unique=True)
    captain = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="captain")
    team_creation_date = models.DateTimeField(auto_now_add=True, null=True)
    players = models.ManyToManyField(Player, through="PlayerTeam", related_name="players")

class PlayerTeam(models.Model):
    player = models.ForeignKey(Player,on_delete=models.CASCADE)
    team = models.ForeignKey(Team,on_delete=models.CASCADE)
    join_date = models.DateField(auto_now_add=True)

【问题讨论】:

  • 我看到你在这里有团队和玩家的双重连接。您只需要在 Team 模型中保留一个 player = ManyToMany 或在 Team 模型中保留 player = ForeighKey(Player)。
  • @SergeyPugach 不,PlayerTeam 是 Team 和 Player 之间的 ManyToMany 的直通模型(模型未在问题中显示),所以这是正确的。

标签: django orm django-queryset


【解决方案1】:

不使用 Q 的一种解决方案是排除拥有共同球员的球队。

selected_team = Team.objects.get(...) # get selected team
not_allowed_players = selected.team.players.all()
teams = Team.objects.all().exclude(players__in=not_allowed_players)

【讨论】:

  • 成功了,谢谢。我是 django 新手,没想过使用 __in
  • @Nicolas 很高兴听到 :) 你介意接受我的回答作为解决方案吗
猜你喜欢
  • 2020-06-16
  • 2015-01-11
  • 2015-11-15
  • 2018-12-19
  • 2014-04-18
  • 2022-10-05
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多