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()
多対多の関係により、属性を使用して関連データにアクセスできます (Team オブジェクトの「players」属性、または Player オブジェクトの「teams」属性をその関連名として使用)。オブジェクトの 1 つがテンプレートのコンテキストに配置されると (たとえば、チームの名簿を生成するテンプレートをレンダリングするためのコンテキストに配置されたチーム)、関連するオブジェクト (つまり、チームのプレーヤー) にアクセスできますが、どのようにアクセスできますか?コンテキストに追加データを追加せずに、コンテキスト内のオブジェクト (チームなど) から関連オブジェクトとともに追加データ (「キャプテン」など) にアクセスできますか?
中間テーブルに対して直接クエリを実行して、追加のデータを取得できることはわかっています。例えば:
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 でのクエリの結果) に追加のデータを配置する必要がありますが、そのようなことが可能であれば回避しようとしています。