如何访问多对多“通过”的属性。表从django模板? [英] How do I access the properties of a many-to-many "through" table from a django template?

查看:107
本文介绍了如何访问多对多“通过”的属性。表从django模板?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从Django文档...

From the Django documentation...


当你只处理简单的多对多关系,如混合和匹配比萨饼和浇头,一个标准的ManyToManyField是你需要的。然而,有时您可能需要将数据与两个模型之间的关系相关联。

When you're only dealing with simple many-to-many relationships such as mixing and matching pizzas and toppings, a standard ManyToManyField is all you need. However, sometimes you may need to associate data with the relationship between two models.

例如,考虑跟踪音乐家所属音乐组的应用程序的情况。一个人和他们所属的群体之间存在着多对多的关系,所以你可以使用一个ManyToManyField代表这种关系。但是,有很多关于您可能想要收集的会员资格的详细信息,例如该人加入该组的日期。

For example, consider the case of an application tracking the musical groups which musicians belong to. There is a many-to-many relationship between a person and the groups of which they are a member, so you could use a ManyToManyField to represent this relationship. However, there is a lot of detail about the membership that you might want to collect, such as the date at which the person joined the group.

对于这些情况,Django允许您指定将用于管理多对多关系的模型。然后,您可以在中间模型上添加额外的字段。中间模型与ManyToManyField相关联,使用通过参数指向将作为中介的模型。对于我们的音乐人的例子,代码看起来像这样:

For these situations, Django allows you to specify the model that will be used to govern the many-to-many relationship. You can then put extra fields on the intermediate model. The intermediate model is associated with the ManyToManyField using the through argument to point to the model that will act as an intermediary. For our musician example, the code would look something like this:



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),您可以开始创建多对多关系。您可以通过创建中间模型的实例:

Now that you have set up your ManyToManyField to use your intermediary model (Membership, in this case), you're ready to start creating some many-to-many relationships. You do this by creating instances of the intermediate model:



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>]




source: http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

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

My question is, how do I set up my view and template to access these additional attributes. Say I have a band page and I want to display the band name, iterate through the membership records and display names and date_joined.

我应该将乐队对象传递给模板?或者我是否通过会员对象?

Should I pass a band object to the template? Or do I pass the membership objects somehow?

如何在模板中创建for循环?

And how would I create the for loops in in the template?

谢谢。

推荐答案

最简单的方法只是传递带到模板。模板能够导航模型之间的关系,并且Group上有成员和membership_set查询管理器。所以这里是如何做的:

The easiest way is just to pass the band to the template. Templates are capable of navigating the relationships between models and there is both members and membership_set queryset managers on Group. So here is how I would do it:

查看:

def group_details(request, group_id):
    group = get_object_or_404(Group, pk=group_id)
    return render_to_response('group_details.html',
                              {'group': group})

模板:

<h2>{{ group.name }}</h2>
{% for membership in group.membership_set.all %}
    <h3>{{ membership.person }}</h3>
    {{ membership.date_joined }}
{% endfor %}

这篇关于如何访问多对多“通过”的属性。表从django模板?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆