Djangoのドキュメントから...
ピザとトッピングの組み合わせなど、単純な多対多の関係のみを扱う場合は、標準の ManyToManyField だけで十分です。ただし、データを 2 つのモデル間の関係に関連付ける必要がある場合もあります。
たとえば、ミュージシャンが所属する音楽グループを追跡するアプリケーションの場合を考えてみましょう。個人とその個人がメンバーであるグループとの間には多対多の関係があるため、ManyToManyField を使用してこの関係を表すことができます。ただし、ユーザーがグループに参加した日付など、収集したいメンバーシップに関する詳細が多数あります。
このような状況では、Django では、多対多の関係を管理するために使用されるモデルを指定できます。その後、中間モデルに追加のフィールドを配置できます。中間モデルは、中間として機能するモデルを指すスルー引数を使用して、ManyToManyField に関連付けられます。ミュージシャンの例では、コードは次のようになります。
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
中間モデル (この場合はメンバーシップ) を使用するように ManyToManyField を設定したので、多対多の関係の作成を開始する準備が整いました。これを行うには、中間モデルのインスタンスを作成します。
ringo = Person.objects.create(name="Ringo Starr")
paul = Person.objects.create(name="Paul McCartney")
beatles = Group.objects.create(name="The Beatles")
m1 = Membership(person=ringo, group=beatles,
... date_joined=date(1962, 8, 16),
... invite_reason= "Needed a new drummer.")
m1.save()
beatles.members.all()
[<Person: Ringo Starr>]
ringo.group_set.all()
[<Group: The Beatles>]
m2 = Membership.objects.create(person=paul, group=beatles,
... date_joined=date(1960, 8, 1),
... invite_reason= "Wanted to form a band.")
beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]
ソース: http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany
私の質問は、これらの追加の属性にアクセスするためにビューとテンプレートをどのように設定するかです。バンド ページがあり、バンド名を表示し、メンバーシップ レコードを反復処理して、names と date_joined を表示するとします。
テンプレートにバンド オブジェクトを渡す必要がありますか? それとも、何らかの方法でメンバーシップ オブジェクトを渡しますか?
テンプレートに for ループを作成するにはどうすればよいでしょうか。
ありがとう。