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,我会显示第一个。

我究竟做错了什么?除此之外,它可能比这更容易完成。:) 我愿意接受更好的方法。

4

2 回答 2

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 }}通过循环为每个联系人调用您的模板。

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

于 2012-07-09T12:10:35.960 回答
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”。

于 2012-07-09T12:14:59.937 回答