Django - 阅读计数和显示

统计每天记录数

添加统计每天记录数模型

# 记录每一天, 每一篇博客的阅读数
class ReadDetail(models.Model):
    date = models.DateField(default=timezone.now)
    read_num = models.IntegerField(default=0)

    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

统计方法

def read_statistics_once_read(request, obj):
    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.read_num += 1
        readnum.save()


        date = timezone.now().date()
        if ReadDetail.objects.filter(content_type=ct, object_id=obj.pk, date=date).count():
            readDetail = ReadDetail.objects.get(content_type=ct, object_id=obj.pk, date=date)
        else:
            readDetail = ReadDetail(content_type=ct, object_id=obj.pk, date=date)
        readDetail.read_num += 1
        readDetail.save()
    return key

get_or_create

  • get_or_create(默认值= None,** kwargs) : 查找, 如果查找不到就创建一个对象

使用get_or_create替换原来的方法

# 统计记录数方法
def read_statistics_once_read(request, obj):
    ct = ContentType.objects.get_for_model(obj)
    key = "%s_%s_read" % (ct.model, obj.pk)

    if not request.COOKIES.get(key):
        # 总阅读数
        readnum, created = ReadNum.objects.get_or_create(content_type=ct, object_id=obj.pk)
        readnum.read_num += 1
        readnum.save()

        # 当天阅读数
        date = timezone.now().date()
        readDetail, created = ReadDetail.objects.get_or_create(content_type=ct, object_id=obj.pk, date=date)
        readDetail.read_num += 1
        readDetail.save()
    return key
        

统计前七天的阅读数

使用timedelta

  • timedalte 是datetime中的一个对象,该对象表示两个时间的差值

  • 构造函数:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

聚合函数

  • aggregate : aggregate()子句的参数描述了我们想要计算的聚合值,aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

统计方法

# 获取前七天的阅读数
def get_seven_date_read_num(content_type):
    today = timezone.now().date()
    read_nums = []
    for i in range(7, 0, -1):
        date = today - datetime.timedelta(days=i)
        read_details = ReadDetail.objects.filter(content_type=content_type, date=date)
        result = read_details.aggregate(read_num_sum=Sum('read_num'))
        read_nums.append(result['read_num_sum'])
    return read_nums

首页引用统计方法

def home(request):
    context = {}
    content_type = ContentType.objects.get_for_model(Blog)
    read_nums = get_seven_date_read_num(content_type)
    context['read_nums'] = read_nums
    return render(request, 'home.html', context)

使用highcharts图表显示阅读量

<!-- 图表容器 DOM -->
<div id="container" style="width: 600px;height:400px;"></div>
<script>
    // 图表配置
    var options = {
        chart: { type: 'line' },
        title: { text: '七天阅读量' },
        xAxis: {
            categories: {{ read_dates|safe }},
            tickmarkPlacement: 'on',
        },
        yAxis: {
            title: { text: null },
            labels: {enabled: false},
            gridLineDashStyle: 'Dash',
        },
        series: [{                              // 数据列
            name: '阅读量',                        // 数据列名
            data: {{ read_nums }}                     // 数据
        }],
        plotOptions: {
            line: {
                dataLabels: {
                    enabled: true
                }
            }
        },
        credits: {enabled: false},
    };
    // 图表初始化函数
    var chart = Highcharts.chart('container', options);
</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值