在Django中将查询集分为'read'/'unread'

时间:2016-09-07 13:38:54

标签: django

我正在尝试根据用户操作(请求)创建状态为“已读”/“未读”的徽章标记。

模型

class Post(models.Model):
    title = models.CharField(max_length=120)
    body = models.TextField()
    def get_absolute_url(self):
        return "/%s" %(self.id)
    ...
class Comment(models.Model):
    post = models.ForeignKey(Post)
    ...

查看

def list(request):
    qs_posts = Post.object.all()
    ...

模板

{% for post in qs_posts %}
    <a href="{{ post.get_absolute_url }}" class="btn btn-primary">View</a>
    <p>{{ post.body }}</p>
    <p> all messages: <span class="badge">{{ post.comment_set.count }}</span></p>
    <p> unread messages: <span class="badge red">{{ post.comment_set.count }}</span></p>
{% endfor %}

我正在尝试显示“未读”的计数。不需要为任何请求仅为特定用户显示它。

1 个答案:

答案 0 :(得分:1)

因此,根据您给定的代码,您可以通过几种不同的方式解决此特定问题。我将概述其中的一些内容,以便您继续前进。

第一个选项是Post模型中的一个简单帮助方法。像这样:

class Post(models.Model):
...
    def get_unread_comment_count():
        unread_comments = 0
        for comment in comment_set:
            unread_comments += 1
        return unread_comments

然后您在模板中调用该方法,如下所示:

<p> unread messages: <span class="badge red">{{ post.get_unread_comment_count() }}</span></p>

另一种选择可能只是在模型中放置一个字段。

class Post(models.Model):
    ...
    unread_count = models.IntegerField(default=0)

每次添加新的未读评论时(这可能是非常频繁或不经常,不确定此网站将获得的流量),这可能会有点费用。您必须访问数据库。

最终选项可能是设计自己的标签?我对此并不熟悉,但如果你愿意的话,你可以加入谷歌并对其进行破解。