我有这些表格:
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}}正常工作,但我没有收回与该记录关联的所有其他字段。例如同意和角色。 我该怎么做?
答案 0 :(得分:2)
ac
是Contact
个实例,而不是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 %}