как вернуть все поля записи в отношениях многих ко многим - PullRequest
1 голос
/ 09 мая 2011

У меня есть эти таблицы:

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 ]

2 голосов
/ 09 мая 2011

ac - это экземпляр Contact, а не ContractPartyInvolved.Так что ac.agreed не будет работать (если у вас также нет поля agreed в Контакте, которое вы не показываете).

Вместо того, чтобы следовать отношению ManyToMany и получать contract.agreed_contacts.all(), вы хотитеследуйте обратному ForeignKey от Контакта до ИПЦ.Оттуда вы можете получить доступ ко всем полям в ИПЦ, а также продолжить, следуя связи с Контактом, и получить имя контакта:

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


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

Обратите внимание, что я использовал select_related в начальном запросе, чтобы сохранитьдальнейшие хиты дБ, как вы знаете, вы будете следовать отношениям.Если вы также не хотите получать доступ к роли, вы можете ограничить select_related, указав select_related('Contact').

1 голос
/ 09 мая 2011

в поле зрения:

involved_contacts = contract.contractpartyinvolved_set.all()

в шаблоне:

{% for icontact in involved_contacts %}
    <strong> {{ icontact.agreed }} || {{ icontact.contact }}</strong>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...