我如何从Django模板中访问多对多“通过”表的属性?

7 浏览
0 Comments

我如何从Django模板中访问多对多“通过”表的属性?

根据Django文档...

当你只处理简单的多对多关系,例如混合和匹配比萨和配料时,一个标准的ManyToManyField就足够了。然而,有时你可能需要将数据与两个模型之间的关系关联起来。

例如,考虑一个跟踪音乐家所属乐队的应用程序。一个人和他们所属的乐队之间存在多对多关系,所以你可以使用ManyToManyField来表示这种关系。然而,关于成员资格的详细信息可能是你想要收集的,比如人员加入乐队的日期。

对于这些情况,Django允许你指定将用于管理多对多关系的模型。然后你可以在中间模型上放置额外的字段。中间模型使用through参数与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使用中间模型(在这种情况下是Membership),你可以开始创建一些多对多关系。你可以通过创建中间模型的实例来实现:

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()
[]
ringo.group_set.all()
[]
m2 = Membership.objects.create(person=paul, group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason= "Wanted to form a band.")
beatles.members.all()
[, ]

我的问题是,如何设置我的视图和模板来访问这些附加属性。比如我有一个乐队页面,我想显示乐队名称,遍历成员记录并显示姓名和加入日期。

我应该将一个乐队对象传递给模板吗?还是我以某种方式传递成员对象?

在模板中,我该怎么创建循环?

谢谢。

0