目录
统计每天记录数
添加统计每天记录数模型
# 记录每一天, 每一篇博客的阅读数
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>