2011-05-09 34 views
1

我有這些表:如何找回記錄的所有字段的多對多的關係

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}}正常工作,但我沒有找回與該記錄關聯的所有其他字段。例如同意和角色。 我該怎麼做?

回答

1
鑑於

involved_contacts = contract.contractpartyinvolved_set.all() 

模板:

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

acContact實例,而不是一個ContractPartyInvolved一個。因此ac.agreed將不起作用(除非您還在聯繫人上有agreed字段,您不會顯示該字段)。

您不希望遵循ManyToMany關係並得到contract.agreed_contacts.all(),而是希望按照聯繫人到CPI的反向外鍵。從那裏,你可以訪問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。

+0

+1對於select_related。忘記進一步的數據庫命中從cpi中檢索聯繫人。謝謝。 – DTing 2011-05-09 09:07:42

相關問題