如何显示对象的相关内容

时间:2012-07-09 11:25:57

标签: django

我有一个可以有很多对话的Contact类。但每个对话都属于一个联系人。 所以它是一对多关系。

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 个答案:

答案 0 :(得分:2)

您无法在模板语言中执行此类间接查找 - calls.idx将始终引用属于idx的属性calls

但是我认为更好的解决方案是将调用值直接添加到联系对象上 - 不要忘记Python对象是动态的,因此您可以在其上添加任何您喜欢的内容。

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

顺便说一句,max真的有效吗?我不确定基于的比较是做什么的。另一种方法是在对话模型中定义get_latest_by,然后您可以完全避免此循环,只需在模板中为每个联系人通过循环调用{{ contact.conversation_set.get_latest }}

(请注意,这仍然是非常低效的,有多种方法可以一次性获得整套最大对话,但现在可以做到。)

答案 1 :(得分: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”即可。