python - 在 Django 中,如何在没有显式查询的情况下从多对多关系的额外字段中检索数据?

标签 python django manytomanyfield

假设在 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/

相关文章:

python - Pandas 数据框删除每个数字的第一行

python - Pandas - 在 groupby 中聚合、排序和最大

python - 如何在 Django 中断言模型字段已经从数据库中填充?

python - syncdb 不会为嵌套模型创建表

python - 过滤 Django ManyToMany 字段中的初始数据

python - 将 3D 数据作为 Keras 序列模型层的输入进行拟合

python - 使用 lxml 替换 HTML 标签并保留其内容

mysql - 每次项目运行时django都会给出重复的错误

Django: "limit_choices_to"不适用于 ManyToManyField