如何在多对多关系中取回记录的所有字段

时间:2011-05-09 07:08:39

标签: django

我有这些表格:

class Contract(models.Model):
    project = models.ForeignKey(Project)
    start_date = models.DateField()
    agreed_contacts = models.ManyToManyField(Contact, through='ContractPartyInvolved')


class ContractPartyInvolved(models.Model):
    contact = models.ForeignKey(Contact)
    contract = models.ForeignKey(Contract)
    role = models.ForeignKey(Role)
    agreed = models.BooleanField()

我想查询以获取链接到特定合同的所有联系人,所以我在我看来已经这样做了:

def generate_contract(request, id):
    contract = get_object_or_404(Contract, pk=id)
    agreedContacts = contract.agreed_contacts.all()

    return render_to_response('contract.html', {'agreedContacts' : agreedContacts })

现在我的模板中有:

  {% for ac in agreedContacts %}
       <strong> {{ ac.agreed }} || {{ ac }}</strong>
  {% endfor %}

问题在于我只返回名称,{{ac}}正常工作,但我没有收回与该记录关联的所有其他字段。例如同意和角色。 我该怎么做?

2 个答案:

答案 0 :(得分:2)

acContact个实例,而不是ContractPartyInvolved个实例。因此,ac.agreed将不起作用(除非您在联系人上也有agreed字段,但您未显示该字段。

您希望关注从Contact到CPI的反向ForeignKey,而不是遵循ManyToMany关系并获取contract.agreed_contacts.all()。从那里,您可以访问CPI上的所有字段,并继续关注与联系人的关系并获取联系人姓名:

cpis = contract.contractpartyinvolved_set.select_related().all()


{% for cpi in cpis %}
    {{ cpi.agreed }} || {{ cpi.contact.name }}
{% endfor %}

请注意,我在初始查询中使用了select_related,以便保存更多数据库命中,因为您知道您将关注此关系。如果您也不想访问角色,可以通过指定select_related('Contact')来限制select_related。

答案 1 :(得分:1)

在视图中:

involved_contacts = contract.contractpartyinvolved_set.all()
模板中的

{% for icontact in involved_contacts %}
    <strong> {{ icontact.agreed }} || {{ icontact.contact }}</strong>
{% endfor %}