我有一个可以有很多对话的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,我会显示第一个。
我做错了什么?除了它可能比这更容易完成的事实。 :)我愿意接受更好的方法。
答案 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”即可。