我有这个查询集:
topics = Topic.objects.select_related('creator').filter(forum=forum_id).order_by("-created")
我希望在重新发送到模板之前添加一个额外的布尔字段is_unread
,这是在基于另一个模型的视图中计算的。此字段不在Topic模型中,应在视图中单独为每个request.user计算。
业务逻辑的伪代码是这样的:
for topic in topics:
if topic.lastposted > request.user.lastvisit.thistopic:
topic.is_unread = True
包含lastvist的模型是:
class LastVisitedTopic(models.Model):
user = models.ForeignKey(User)
forum = models.ForeignKey(Forum)
topic = models.ForeignKey(Topic)
lastvisited = models.DateTimeField(auto_now=True)
当我打印出topics
时,它会给出一堆对象:
[<Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, '...(remaining elements truncated)...']
所以我不确定如何将is_unread
附加到他们身上。非常感谢您的提示......
答案 0 :(得分:1)
你的方式应该有效,但管理起来有点困难。您应该在Topic
类上创建一个属性方法,然后调用它:
class Topic(models.Model):
# some fields go there
@property
def is_unread(self):
if self.last_posted > self.visitor.lasthit:
return True
else:
return False
然后当你topic.is_unread
没有括号时,它会返回你想要的值。
Python doc。
修改强>:
听起来OP并没有让所有参数都驻留在Topic
模型上。在这种情况下,它回退到原始实现:
for topic in topics:
if topic.lastposted > request.user.lastvisit.thistopic:
topic.is_unread = True
else:
topic.is_unread = False
在您的模板中,您可以这样做:
{% for topic in topics %}
{{ topic.is_unread }}
{% endfor %}