如果在Django 1.0中出现以下情况:

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

class Team(models.Model):
  name = models.CharField(max_length=40)
  players = models.ManyToManyField(Player, through='TeamPlayer', related_name='teams')

class TeamPlayer(models.Model):
  player = models.ForeignKey(Player)
  team = models.ForeignKey(Team)
  captain = models.BooleanField()

多对多关系允许您使用属性(团队对象上的“玩家”属性或通过其相关名称在玩家对象上使用“团队”属性)访问相关数据。当其中一个对象被放置到模板的上下文中(例如,放置到上下文中的团队,用于呈现生成团队花名册的模板)时,可以访问相关的对象(即团队中的玩家),但如何访问额外的数据(例如“队长”)以及上下文中对象的相关对象(例如团队),而不向上下文中添加其他数据?
我知道可以直接查询中介表来获取额外的数据。例如:
TeamPlayer.objects.get(player=790, team=168).captain

或:
for x in TeamPlayer.objects.filter(team=168):
  if x.captain:
    print "%s (Captain)" % (x.player.name)
  else:
    print x.player.name

但是,直接在中间表上执行此操作需要我在模板上下文(TeamPlayer查询的结果)中放置额外的数据,如果可能的话,我会尽量避免这样做。

最佳答案

所以,问了15分钟后,我找到了自己的答案。
使用dir(Team),我可以看到另一个生成的名为teamplayer_set的属性(它也存在于player上)。

t = Team.objects.get(pk=168)
for x in t.teamplayer_set.all():
  if x.captain:
    print "%s (Captain)" % (x.player.name)
  else:
    print x.player.name

不确定如何自定义生成的相关名称,但至少我知道我可以从模板获取数据,而无需向上下文中添加其他查询结果。

关于python - 在Django中,如何在没有显式查询的情况下从多对多关系中的额外字段中检索数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/493304/

10-11 03:37
查看更多