如何在渲染之前向查询集结果添加额外参数?

时间:2015-12-17 17:38:53

标签: django django-views

我有这个查询集:

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附加到他们身上。非常感谢您的提示......

1 个答案:

答案 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 %}