给之前图标增加标题:home.html中的title中添加x轴分类下面
title: { text: '前7日阅读量变化'},
再utils中增加一个get\_today)hot\_data方法用于获取今天一天的热点数据
# utils.py
......
def get_today_hot_data(content_type):
"""
用于获取今天24小时内的热门数据
"""
today = timezone.now().data()
# 下句:用于从数据库模型中读取阅读量表格然后倒序(先多后少)排序返回(字符集)
read_details = ReadDetail.objects.filter(content_type=content_type,date=today).order_by('-read_num')
return read_details[:7] # 用于取前条博文
视图函数中将上面定义的方法引入然后再home中使用此方法获取今天的热门数据,然后放在context中,
# mysite\views.py
from read_statistics.utils import get_seven_days_read_data,get_today_hot_data
...
def home(request):
...
today_hot_data = get_today_hot_data(blog_content_type)
...
context['today_hot_data'] = today_hot_data
...
写入home.html中
{# home.html#}
<div class="hot-data">
<h3>今天热门博客</h3>
<ul>
{% for hot_data in today_hot_data %}
<li><a href="{% url 'blog_detail' hot_data.content_object.pk %}">{{ hot_data.content_object.title }}</a>({{ hot_data.read_num }})</li>
{% empty %}
<li>今天暂时没有热门博客</li>
{% endfor %}
</ul>
</div>
运行展示
没有博文,我们去创建一个博文
增加昨天的热门博文:
utils.py中增加get_yestday_hot_data
......
def get_yesterday_hot_data(content_type):
"""
用于获取昨天的热门博文
"""
today = timezone.now().date()
yesterday = today - datetime.timedelta(days=1) # 昨天等于今天减去1天;timedelta(days=x) 表示差值为x天
read_details = ReadDetail.objects.filter(content_type=content_type, date=yesterday).order_by('-read_num')
return read_details[:7]
返回到views.py并调用
导入和调用
# mysite/views.py
from read_statistics.utils import get_seven_days_read_data,get_today_hot_data,get_yesterday_hot_data
......
def home(request):
...
context['yesterday_hot_data'] = get_yesterday_hot_data(blog_content_type)
...
home.html中增加昨天热门点击的代码
<div class="hot-data">
<h3>昨天热门博客</h3>
<ul>
{% for hot_data in yesterday_hot_data %}
<li><a href="{% url 'blog_detail' hot_data.content_object.pk %}">{{ hot_data.content_object.title }}</a>({{ hot_data.read_num }})</li>
{% empty %}
<li>昨天暂时没有热门博客</li>
{% endfor %}
</ul>
</div>
效果如下:
其中,如果昨天有多条博文,左下角也会显示多条,这样显示很难看,所以希望只显示前七条,方法如下:read_details[:7]
获取和展示前七天的hot_data:
在views.py中新建get_7_days_hot_blogs()函数(导入timezone),用于关联模型,
from django.utils import timezone
from django.db.models import Sum
......
def get_7_days_hot_blogs():
today = timezone.now().date()
date = today - datetime.timedelta(days=7)
# filter:筛选;values:提取指定数据;annotate:分组统计;order_by:倒序排序;
blogs = Blog.objects \
.filter(read_details__date__lt=today, read_details__date__gte=date) \
.values('id', 'title') \
.annotate(read_num_sum=Sum('read_details__read_num')) \
.order_by('-read_num_sum')
return blogs[:7]
因为统计出来的比较零散,所以使用values和annotate方法对得到的博文进行分组统计
因为存在Django上的使用问题,这里操作如下:
models.py中导入GenericRelation和Readdetails,Blog中增加read\_deatils用于关联模型
# models.py
from django.contrib.contenttypes.fields import GenericRelation
from read_statistics.models import ReadNumExpandMethod, ReadDetail
class Blog(models.Model,ReadNumExpandMethod):
......
read_details = GenericRelation(ReadDetail)
......
写入home.html中:
<div class="hot-data">
<h3>7天热门博客</h3>
<ul>
{% for hot_blog in hot_blogs_for_7_days %}
<li><a href="{% url 'blog_detail' hot_blog.id %}">{{ hot_blog.title }}</a>({{ hot_blog.read_num_sum }})</li>
{% empty %}
<li>昨天暂时没有热门博客</li>
{% endfor %}
</ul>
</div>
其他:
每次运行时都要计算有几条数据,比较耗时,方法:使用缓存;
- 内存缓存
- 数据库缓存
- 文件缓存
这里我是用数据库缓存:
从django官网的cache搜索结果中找数据库缓存,复制下来代码然后拷入settings.py中,
# 缓存设置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
然后创建缓存表:python manage.py createcachetable
在views.py中引用和使用
导入caches,获取7天热门博客的缓存数据,注意cache的s要去掉
from django.core.cache import cache
......
def home(request):
...
# 获取7天热门博客的缓存数据
hot_blogs_for_7_days = cache.get('hot_blogs_for_7_days')
if hot_blogs_for_7_days is None:
hot_blogs_for_7_days = get_7_days_hot_blogs()
cache.set('hot_blogs_for_7_days', hot_blogs_for_7_days, 3600) # 失效时间为3600秒(一小时)
...
context['hot_blogs_for_7_days'] = hot_blogs_for_7_days
......
完善css代码漂亮的显示
div.hot-data {
text-align: center;
margin-top: 2em;
}
效果如下:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。