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 字段的值,以提高效率。

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

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

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

设置热门文章排名如下

 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})

 

 

posted @ 2018-11-27 12:51  James_23  阅读(2156)  评论(0编辑  收藏  举报