Django20200408博客开发014
为上一个图标添加标题:在home.html中为标题添加x轴分类title:{text:'前7天阅读量变化'},添加一个get\_todaytoutils)hot\_data方法用于获取今日热点数据#utils.py......defget_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')returnread_details[:7]#用于获取上一篇博文查看函数,引入上面定义的方法然后在home中使用这个方法获取今天的热门数据,然后将其放入上下文中,#mysite\views.pyfromread_statistics.utilsimportget_seven_days_read_data,get_today_hot_data...defhome(request):...today_hot_data=get_today_hot_data(blog_content_type)...context['today_hot_data']=today_hot_data...写入home.html{#home.html#}今日热门博客
{%forhot_dataintoday_hot_data%}- {{hot_data.content_object.title}}({{hot_data.read_num}})
{%empty%}- 今天没有热门博客
{%endfor%}
运行显示没有博文,我们新建一个博文添加昨天的热门博文:在utils.py中添加get_yestday_hot_data......defget_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')returnread_details[:7]返回views.py并调用导入并调用#mysite/views.pyfromread_statistics.utilsimportget_seven_days_read_data,get_today_hot_data,get_yesterday_hot_data...defhome(request):...context['yesterday_hot_data']=get_yesterday_hot_data(blog_content_type)...添加代码ofhome.html昨日热播
{%forhot_datainyesterday_hot_data%}- {{hot_data.content_object.title}}({{hot_data.read_num}})
{%empty%}- 昨天没有热门博客
{%endfor%}
如下:其中,如果昨天的博文很多,左下角也会显示多篇博文,很难看,所以希望只显示前七篇。方法如下:read_details[:7]获取并显示前7天的hot_data:inviews。在py(importtimezone)中新建get_7_days_hot_blogs()函数,用于关联模型,fromdjango.utilsimporttimezonefromdjango.db.modelsimportSum......defget_7_days_hot_blogs():today=timezone.now().date()date=today-datetime.timedelta(days=7)#过滤器:过滤器;values:提取指定数据;注释:分组统计;order_by:倒序;blogs=Blog.objects\.filter(read_details__date__lt=today,read___details__date日期)\.values('id','title')\.annotate(read_num_sum=Sum('read_details__read_num'))\.order_by('-read_num_sum')returnblogs[:7]由于统计比较分散,所以使用values和annotate方法对获取的博文进行分组统计,因为它们在Django上存在使用问题,这里的操作如下:importGenericRelationandReaddetailsinmodels.py,addread\_deatilsinBlogforassociationmodels#models.pyfromdjango.contrib.contenttypes.fieldsimportGenericRelationfromread_statistics.modelsimportReadNumExpandMethod,ReadDetailclassBlog(models.Model,ReadNumExpandMethod):......read_details=GenericRelation(ReadDetail)......写在home.html:
7-天热门博客
{%forhot_bloginhot_blogs_for_7_days%}- {{hot_blog.title}}({{hot_blog.read_num_sum}})
,数据,耗时,方法:使用慢节省;memorycachedatabasecachefilecache这里我使用的是databasecache:从django官网的cache搜索结果中找到databasecache,复制代码复制到settings.py中,#cachesettingsCACHES={'default':{'BACKEND':'django.core.cache.backends.db.DatabaseCache','LOCATION':'my_cache_table',}}然后创建缓存表:pythonmanage.pycreatecachetablereferenceanduseimportcachesinviews.py,get7热门博客7天的缓存数据,注意去掉缓存的sfromdjango.core.cacheimportcache......defhome(request):...#获取热门博客的缓存数据7天hot_blogs_for_7_days=cache.get('hot_blogs_for_7_days')如果hot_blogs_for_for_7_daysnonenone:hot_blogs_for_7_days=get_7_7_days_hot_hot_hot_hot_hot_hot_hot_hot_blogs().context['hot_blogs_for_7_days']=hot_blogs_for_7_days......完美的css代码显示div.hot-data{text-align:中心;margin-top:2em;}效果如下: