假设在 Django 1.0 中你有 extra data on a Many-to-Many relationship 的情况:
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()
多对多关系允许您使用属性访问相关数据(Team 对象上的“players”属性或通过其相关名称使用 Player 对象上的“teams”属性)。当其中一个对象被放置到模板的上下文中时(例如,将团队放置到上下文中以呈现生成团队花名册的模板),可以访问相关对象(即团队中的球员),但是如何在不向上下文中添加额外数据的情况下,额外数据(例如“队长”)与上下文中对象(例如团队)的相关对象一起访问吗?
我知道可以直接查询中间表来获取额外数据。例如:
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
不确定如何自定义生成的 related_name,但至少我知道我可以从模板中获取数据,而无需将额外的查询结果添加到上下文中。
关于python - 在 Django 中,如何在没有显式查询的情况下从多对多关系的额外字段中检索数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/493304/