我的网站搭建: (第七天) 简单阅读计数

简介:  如果知道每篇文章的浏览量,管理员就可以了解到访问者对文章的喜好程度,方便后续推出相关内容文章,同时对热门博客的统计和阅读趋势图打好基础。

 如果知道每篇文章的浏览量,管理员就可以了解到访问者对文章的喜好程度,方便后续推出相关内容文章,同时对热门博客的统计和阅读趋势图打好基础。针对阅读统计功能,前前后后我一共想到了三种方法,各种方法都有利有弊。

方法一:采用该模型字段计数

    1.修改Post模型read_num
    2.优化:设置cookie判断是否用户多次点击response.set_cookie()

    优点:简单
    缺点:1.后台编辑博客可能影响数据
               2.功能单一,无法统计某一天的阅读数量

    具体实现:

    1.在Post模型类中直接定义一个read_num的字段名

read_num = models.IntegerField(default=0)

    2.然后可以通过对Post属性read_num的操作来实现阅读计数+1的逻辑处理

post.read_num += 1
    post.save()

方法二:设计功能独立的ReadNum模型数据表

    1.添加read_num字段
    2.增加post外键
    3.利用ReadNum.objects.filter(post=post)来过滤当前的文章计数对象
    4.优化:设置cookie判断是否用户多次点击response.set_cookie()

    具体实现:

    1.在blog/models.py文件中,与定义Post类似,定义一个ReadNum的模型类

class ReadNum(models.Model):
    read_num = models.IntegerField(u'阅读次数', default=0)
    post = models.OneToOneField(Post, on_delete=models.CASCADE)

    def __str__(self):
        return self.read_num

    class Meta:
        verbose_name = '阅读'
        verbose_name_plural = '阅读'

    2.通过objects的filter方法来过滤当前博客是否有阅读的记录,如不存在记录,则创建新的readnum计数对象

if ReadNum.objects.filter(post=post).count():
    # 存在记录
    readnum = ReadNum.objects.get(post=post)
else:
    # 不存在记录
    readnum = ReadNum(post=post)

readnum.read_num += 1
readnum.save()

    3.阅读计数表就算是建好了,还需要将阅读数量加到后台的每篇文章中,在Post模型类中添加该方法

def get_read_num(self):
    try:
        return self.readnum.read_num

    except exceptions.ObjectDoesNotExist:
        return 0

    4.将get_read_num方法添加到admin.py的list_display中

list_display = ('id', 'title', 'created_time', 'modified_time', 'category', 'author', 'get_read_num')

方法三:设计功能独立的计数应用read_statistics

    1.导入两个模块GenericForeignKeyContentType(非常重要)

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

    2.新增ReadNum模型表,创建read_num这个字段名

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class ReadNum(models.Model):
    """
        单篇博客计数的模型类
        继承model.Model模型类
    """
    read_num = models.IntegerField(u'阅读计数', default=0)

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()

    # 使用contenttypes模型类来找出关联blog
    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        verbose_name = '阅读计数'
        verbose_name_plural = '阅读计数'
        ordering = ['-read_num']

    3.新增utils.py作为工具包,加入阅读计数+1的逻辑处理

ct = ContentType.objects.get_for_model(obj)
key = "%s_%s_read" % (ct.model, obj.pk)
if not request.COOKIES.get(key):

    '''
    if ReadNum.objects.filter(content_type=ct, object_id=obj.pk).count():
        # 存在记录
        readnum = ReadNum.objects.get(content_type=ct, object_id=obj.pk)
    else:
        # 不存在记录
        readnum = ReadNum(content_type=ct, object_id=obj.pk)
    '''

    readnum, created = ReadNum.objects.get_or_create(content_type=ct, object_id=obj.pk)

    # 计数+1
    readnum.read_num += 1
    readnum.save()

    5.解决后台计数对象没创建时的解决办法,新增一个ReadNumExpandMethod类

class ReadNumExpandMethod(object):
    """
        计数扩展类,此方法放在admin的list_display中
        继承object模型类
    """
    def get_read_num(self):
        ct = ContentType.objects.get_for_model(self)
        # 此处的一个异常处理,用来捕获没有计数对象的情况
        # 例如在admin后台中,没有计数值会显示为‘-’
        try:
            readnum = ReadNum.objects.get(content_type=ct, object_id=self.pk)
            return readnum.read_num
        # 对象不存在就返回0
        except exceptions.ObjectDoesNotExist:
            return 0

    然后让blog/models中的Post模型类继承ReadNumExpandMethod类中的方法

class Post(models.Model, ReadNumExpandMethod):  
    ...

    6.将方法加入到blog/amdin.py中的list_display

list_display = ('id', 'title', 'created_time', 'modified_time', 'category', 'author', 'get_read_num')

    以上就是文章阅读计数的简单方法,这三种方法的共同缺点就是功能单一,无法统计某一天的阅读数量,下一篇内容将对阅读计数内容进行优化,增加日期的阅读量查询

相关文章
|
8月前
|
存储 缓存 Unix
微信小游戏制作工具中实现计时功能
微信小游戏制作工具中实现计时功能
291 0
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝(二)
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
111 0
|
5月前
|
监控 小程序 数据可视化
【工具】珍藏免费宝藏工具,不好用你来捶我
本文介绍了四款实用的小工具,包括影刀、Snipaste截图工具、ScreenToGif和墨滴排版工具。影刀可实现操作系统、桌面软件及Web程序的自动化,适用于多个行业;Snipaste则提供了强大的截图与贴图功能;ScreenToGif用于录制GIF动画;墨滴排版工具则帮助美化Markdown文章。
56 0
【工具】珍藏免费宝藏工具,不好用你来捶我
|
5月前
|
数据安全/隐私保护 索引 Windows
这款软件的高级用法,网工直呼:真香!
这款软件的高级用法,网工直呼:真香!
|
8月前
小脑袋吃球球动态代码免费分享
小脑袋吃球球动态代码免费分享,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面
45 2
|
8月前
|
移动开发 安全 Linux
2024龙年新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码
2024龙年新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码
326 0
2024龙年新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码
|
数据采集 Web App开发 JavaScript
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝(一)
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
134 0
|
机器学习/深度学习 程序员 TensorFlow
GitHub排名第一!免费最强“抢票神器”在手,程序员抢票再不用跪求加速包
过年回家的车票抢到了吗?春运一直以来都以难抢票著称,很多人开始通过各种软件和途径,希望能够完成购票大计。按照程序员一向“懒”的做事风格,必然是不愿意自己亲手去做的,直接写一段程序岂不是省时省力?今天分享GitHub标星两万的"抢票神器”。
8572 0
GitHub排名第一!免费最强“抢票神器”在手,程序员抢票再不用跪求加速包
|
数据库
第一遍阅读之《信息系统开发与管理》(二战)
第二次学习信息系统开发与管理,第一感觉是:必过! 信息系统开发与管理距离我们软件的具体开发很近,在我们生物专业学习过程中,有一门课程叫做《食品仪器分析》,其中有一章节的内容讲的大概是建立一个工厂的过程是怎么样的。这其中的方法和我们的《信息系统开发与管理》的内容有异曲同工之妙,我们要建立的是一个工厂,但是摆脱不了和周围事物的联系。
抽签软件免费提供,代码开源,可用作抽奖、课堂抽背、游戏分组等活动场合,可以直接下载
抽签软件免费提供,代码开源,可用作抽奖、课堂抽背、游戏分组等活动场合,可以直接下载
723 1
抽签软件免费提供,代码开源,可用作抽奖、课堂抽背、游戏分组等活动场合,可以直接下载