Django 统计文章阅读量(或热度排名)

Posted daidechong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 统计文章阅读量(或热度排名)相关的知识,希望对你有一定的参考价值。

添加新字段

为了记录文章的访问量,需要在文章的数据库表中新增一个用于存储阅读量的字段。

 

1 /models.py
2 
3 class Post(models.Model):
4     #其它已有字段
5     #新添views字段记录阅读量
6     views = models.PositiveInterField(default=0)

 

注意 views 字段的类型为 PositiveInterField,该类型的值只允许为正整数或0,因为阅读量不可能

为负数。初始化时views的值为0。

添加模型方法

一旦用户访问了某篇文章,只是就应该将views的值 +1,这个过程最好有post模型

自己来完成,因此再给模型添加一个自定义的方法:

 

 1 /models.py
 2 
 3 class Post(models.Model):
 4     # ... 其它已有字段
 5     # 新增 views 字段记录阅读量
 6     views = models.PositiveIntegerField(default=0)
 7     
 8     # ... 其它已有的模型方法  
 9     def increase_views(self):
10         self.views += 1
11         self.save(update_fields=[views])

 

increase_views 方法首先将自身对应的 views 字段的值 +1(此时数据库中的值还没变),

然后调用 save 方法将更改后的值保存到数据库。注意这里使用了 update_fields 参数

来告诉 Django 只更新数据库中 views 字段的值,以提高效率。

你也许担心如果两个人同时访问一篇文章,更改数据库中的阅读量字段的值时会不会冲突?

其实不必担心,我们本来就不是精确地统计阅读量,而且个人博客的流量通常也不会很大,

所以偶尔的冲突导致的数据误差是可以忽略不计的。

修改视图函数

当用户请求访问某篇文章时,处理该请求的视图函数为 detail 。一旦该视图函数被调用,

说明文章被访问了一次,因此我们修改 detail 视图函数,让被访问的文章在视图函数被

调用时阅读量 +1。

 1 blog/views.py
 2 
 3 def detail(request, pk):
 4     post = get_object_or_404(Post, pk=pk)
 5     
 6     # 阅读量 +1
 7     post.increase_views()
 8     
 9     post.body = markdown.markdown(post.body,
10                                   extensions=[
11                                       markdown.extensions.extra,
12                                       markdown.extensions.codehilite,
13                                       markdown.extensions.toc,
14                                   ])
15     form = CommentForm()
16     comment_list = post.comment_set.all()
17     context = {post: post,
18                form: form,
19                comment_list: comment_list
20                }
21     return render(request, blog/detail.html, context=context)

即只需在视图函数中调用模型的 increase_views 方法即可。

设置热门文章排名如下

 

 1 def articlecont(request):
 2     #文档内容
 3     #获取显示的文章id
 4     nid = request.GET.get(nid)
 5     #获取文章
 6     articledata = models.article.objects.filter(id=nid).first()
 7     #获取到的文章调用incease_views方法
 8     models.article.increase_views(articledata)
 9     #根据自增的views字段进行排序,并获取最高的5条数据
10     hotdoc = models.article.objects.order_by("-views")[0:5]
11     return render(request, "articlecont.html", {"articledata": articledata,hotdoc:hotdoc})

 

模板中的操作

在模板中显示阅读量和显示其它字段一样,只需要使用模板变量即可。即模板适当的地方使用 {{ post.views }} 模板变量。这里我们分别修改两个地方,分别是 index.html 和 detail.html。

 

1 templates/blog/detail.html
2 
3 <div class="entry-meta">
4   ...
5   <span class="views-count"><a href="#">{{ post.views }} 阅读</a></span>
6 </div>

 

好了,这样当用户每访问一次文章详情,views 记录的数值就会 +1,从而达到粗略统计阅读量的目的

 

以上是关于Django 统计文章阅读量(或热度排名)的主要内容,如果未能解决你的问题,请参考以下文章

[今日干货]微信搜一搜的文章排名有什么规则

杨泽业:WP-PostViews文章统计插接让你的文章阅读量及时更新

Spark 分析网站排名热度

教你用SQL实现统计排名

教你用SQL实现统计排名

教你用SQL实现统计排名