2012-07-09 3 views
0

많은 대화를 가질 수있는 연락처 클래스가 있습니다. 그러나 각 대화는 하나의 연락처에 속할 수 있습니다. 그것의 일대 다 관계.개체의 관련 콘텐츠를 표시하는 방법

class Contact(models.Model): 
    first_name   = models.CharField() 
    last_name   = models.CharField() 

class Conversation(models.Model): 
    contact    = models.ForeignKey(Contact) 
    notes    = models.TextField() 

    def __unicode__(self): 
     return self.notes 

이제 템플릿에 연락처를 전달할 때 연락처의 마지막 대화를 보여주는 하나의 필드가 필요합니다.

contacts= profile.company.contact_set.all()[:10] 
calls = [] 

for c in contacts: 
    calls.append(max(c.conversation_set.all())) 

와 나는 같은 그들에 전달합니다

vars = {'contacts' : contacts, 'calls': calls} 
variables = RequestContext(request, vars) 
return render_to_response('main_page.html', variables) 

나는이 마법과 함께 제공된 템플릿에서 :

{% for idx, val in contacts %} 
        <tr> 
         <td>... 
         </td> 
         <td>  
          {% if calls %} 
           {{ calls.idx }} 
          {% endif %}</td> 
        </tr> 
{% endfor %} 

이 통화에 대해 아무것도 표시되지 않습니다. 그러나 calls.idx를 calls.0으로 바꾼 경우 첫 번째 메시지가 표시됩니다.

내가 뭘 잘못하고 있니? 그보다 훨씬 쉽게 할 수 있다는 사실 외에도. :) 나는 그것을하는 더 좋은 방법에 대해 열려 있습니다.

답변

2

당신은 템플릿 언어 간접 조회 이런 종류의를 할 수 없어 - calls.idx 항상 calls에 속하는 속성 idx를 참조합니다.

그러나 더 나은 솔루션은 연락처 개체에 직접 호출 값을 추가하는 것입니다. 파이썬 개체가 동적 인 것을 잊지 말고 좋아하는 것에 주석을 달 수 있습니다.

for c in contacts: 
    c.max_call = max(c.conversation_set.all()) 

제쳐두고, max이 실제로 작동합니까? 나는 그것을 기반으로 비교를하고 있을지 모르겠다. 또 다른 방법은 회화 모델에 get_latest_by을 정의한 다음이 루프를 피할 수 있으며 루프를 통해 각 연락처에 대해 템플릿에 {{ contact.conversation_set.get_latest }}을 호출하면됩니다.

는 (여전히 한 번에 최대 대화의 전체 집합을 받고 여러 가지 방법이 있습니다, 매우 비효율적 일 것이 있습니다,하지만 지금은 할 것입니다.) 그런 다음

+0

많은 Daniel 님, 기록을 위해 추가 creation_date = models.DateTimeField (auto_now_add = True, editable = False)를 사용하고 대화 클래스에서 class Meta : get_latest_by = "creation_date"를 추가했습니다. 이 필드는 항상 최신 날짜와 시간을 가졌으므로 최신 항목입니다. 한 번에 전체 항목을 가져 오는 더 좋은 방법이 있다면, 나는 그것에 대해 알고 싶습니다. ;) 당신이 추천할만한 어떤 기사/튜토리얼이 있다면 좋을 것입니다. :) – Houman

0
class Contact(models.Model): 
    # your code here 

    @property 
    def last_conversation(self): 
     try: 
      return self.conversation_set.order_by("-some_date_or_order_field")[0] 
     except IndexError: 
      return None 

이 없습니다 이 문제에 관심을 갖고 템플릿에서 "c.last_contact"를 호출하면됩니다.

+0

우후, 다니엘의 대답은 더 좋습니다 - 평소와 같이 ... –

관련 문제