2012-07-09 90 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.0替換calls.idx,我會顯示第一個。

我在做什麼錯?除了可能做得比這更容易的事實。 :)我開放更好的方式來做到這一點。

回答

2

你不能做這樣的模板語言間接查找 - calls.idx總會是指屬於calls屬性idx

但是我認爲更好的辦法是直接添加的期權價值在接觸對象 - 不要忘了,在Python對象是動態的,所以你可以標註任何你喜歡到他們身上。

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

另外,max真的有用嗎?我不確定基於什麼做比較。另一種方法是在你的會話模型來定義get_latest_by,那麼你就可以完全避免這個循環,只需要調用{{ contact.conversation_set.get_latest }}在你的模板,通過循環每個聯繫人。

(請注意,這仍然是非常低效,也有越來越整套最大對話一氣呵成的各種方式,但它現在做的。)

+0

非常感謝Daniel,爲了記錄,我在Conversation類下增加了'creation_date = models.DateTimeField(auto_now_add = True,editable = False)'並添加了class Meta: get_latest_by =「creation_date」。由於這個領域一直都是日期和時間,所以它確實是最新的條目。如果有更好的方式一次性獲得整套參賽作品,我很想知道它。 ;)如果有任何文章/教程可以推薦會很棒。 :) – Houman 2012-07-09 22:12:09

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

Uhu,丹尼爾的答案是更好 - 像往常一樣... – 2012-07-09 12:16:06