【问题标题】:Django aggregation/annotationDjango 聚合/注释
【发布时间】:2016-11-18 23:07:16
【问题描述】:

我有(这只是一个例子)这样的模型:

class Team(models.Model):
    name = models.CharField(...)


class Player(models.Model):
    name = models.CharField(...)


TeamHasPlayer(models.Model):
    team = models.ForeignKey(Team)
    player = models.ForeignKey(Player)

我需要制作这样的字典:

{
    'Team_1': [Player_1, Player_2, ...],
    'Team_2': [Player_3, Player_4, ...],
    ...
 }

我认为它可以使用 django 注释/聚合工具来实现,我阅读了所有关于它的文档,尝试了许多不同的方法,但我无法实现我想要的。谁能给我任何提示?我不想做任何asking-db-in-for-loop的事情,所以我决定使用聚合/注释。

【问题讨论】:

  • 你需要一个dictteam_ids 作为键和player 对象(或ID?)的列表作为值是正确的吗?
  • 我需要带有团队名称值的字典,并准确列出分配给每个团队名称的球员:)

标签: django django-models annotations aggregation


【解决方案1】:

你可以这样做:

  1. TeamPlayer 之间存在 M2M 关系,创建它。

    class Player(models.Model):
        name = models.CharField(...)
    
        teams = models.ManyToManyField(Team, through='TeamHasPlayer')
    
  2. 获取您的 Team 查询集并使用反向关系 prefetch team.players

    teams = Team.objects.all().prefetch_related('player_set')
    
  3. 现在创建你的团队字典:

    team_dict = {}
    for team in teams:
        team_dict[team.name] = list(team.player_set.all())
    

【讨论】:

  • 太棒了!到目前为止,我一直在尝试避免 ManyToMany 关系,因为它对我来说看起来很复杂。现在我阅读了更多关于它的信息,非常感谢 Todor :)
【解决方案2】:

我会这样做,这样更易​​读和维护。

dic_ = {}
for team in Team.objects.all():
    dic_[team.name] = team.teamhasplayer_set.values_list('player', flat=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2020-05-23
    • 2015-12-29
    • 1970-01-01
    • 2014-02-26
    • 2021-01-20
    • 2017-08-17
    • 2011-07-07
    相关资源
    最近更新 更多