Ale*_*lex 45 python django many-to-many django-templates relationship
从Django文档......
当您只处理简单的多对多关系时,例如混合和匹配比萨饼和浇头,您只需要一个标准的ManyToManyField即可.但是,有时您可能需要将数据与两个模型之间的关系相关联.
例如,考虑应用程序跟踪音乐家所属的音乐组的情况.一个人与他们所属的组之间存在多对多关系,因此您可以使用ManyToManyField来表示此关系.但是,您可能希望收集的成员资格有很多详细信息,例如此人加入该组的日期.
对于这些情况,Django允许您指定将用于管理多对多关系的模型.然后,您可以在中间模型上添加额外的字段.中间模型与ManyToManyField相关联,使用through参数指向将充当中介的模型.对于我们的音乐家示例,代码看起来像这样:
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)
Run Code Online (Sandbox Code Playgroud)
现在您已经设置了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()
[<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>]
Run Code Online (Sandbox Code Playgroud)
来源:http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany
我的问题是,如何设置我的视图和模板来访问这些附加属性.假设我有一个乐队页面,我想显示乐队名称,遍历会员记录并显示名称和date_joined.
我应该将乐队对象传递给模板吗?或者我以某种方式传递会员资格对象?
我将如何在模板中创建for循环?
谢谢.
Ror*_*art 37
最简单的方法就是将乐队传递给模板.模板能够导航模型之间的关系,并且Group上有成员和membership_set查询集管理器.所以我会这样做:
视图:
def group_details(request, group_id):
group = get_object_or_404(Group, pk=group_id)
return render_to_response('group_details.html',
{'group': group})
Run Code Online (Sandbox Code Playgroud)
模板:
<h2>{{ group.name }}</h2>
{% for membership in group.membership_set.all %}
<h3>{{ membership.person }}</h3>
{{ membership.date_joined }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我不确定它是否只是解决方案,但将关系对象传递给模板肯定有效.在您的视图中,获取Membership对象的QuerySet:
rel = Membership.objects.filter( group = your_group ).select_related()
Run Code Online (Sandbox Code Playgroud)
并将其传递给模板,您可以在其中迭代它 {% for %}
{% for r in rel %}
{{ r.person.name }} joined group {{ r.group.name }} on {{ r.date_joined }}<br />
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
请注意,这不应该执行任何其他查询,因为select_related()
.
归档时间: |
|
查看次数: |
30779 次 |
最近记录: |