16

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 でのクエリの結果) に追加のデータを配置する必要がありますが、そのようなことが可能であれば回避しようとしています。

4

1 に答える 1

10

それで、質問をしてから15分後、私は自分の答えを見つけました.

を使用するdir(Team)と、名前が付けられた別の生成された属性が表示されますteamplayer_set(プレーヤーにも存在します)。

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 をどのようにカスタマイズするかはわかりませんが、少なくとも、追加のクエリ結果をコンテキストに追加しなくても、テンプレートからデータにアクセスできることはわかっています。

于 2009-01-29T21:13:53.570 に答える