从零开始的django开发生活之博客分类统计(10)
十、博客分类统计
博客分类数目统计方法1
在get_blog_list_common_data(request, blogs_all_list)方法中写入如下代码
#获取博客分类的对应博客数量
blog_types = BlogType.objects.all()
blog_types_list = []
for blog_type in blog_types:
blog_type.blog_count = Blog.objects.filter(blog_type=blog_type).count()
blog_types_list.append(blog_type)
这里临时为BlogType实例化对象添加了一个属性blog_count,但是怎么做到让属性与分类一一对应呢?解决方法是声明一个列表,计算完属性值之后直接添加到列表中,再将blog_types_list代替之前的BlogType.objects.all()传递给前端页面
在blog_list.html中直接引用blog_count属性
博客分类数目统计方法2
annotate注释:使用annotate扩展查询字段
context['blog_types'] = BlogType.objects.annotate(blog_count=Count('blog'))
使用Count方法要引入Count方法,from django.db.models import Count
annotate扩展了一个字段blog_count,Count()方法中要写与所查询字段相关联的模型名(小写)
日期归档数目统计方法1
#获取日期归档对应博客数量
blog_dates_dict = {}
blog_dates = Blog.objects.dates('created_time', 'month', order='DESC')
for blog_date in blog_dates:
blog_count = Blog.objects.filter(created_time__year=blog_date.year,
created_time__month=blog_date.month).count()
blog_dates_dict[blog_date] = blog_count
同理,我们也可以用循环遍历的方法对日期归档进行统计,但是dates()方法得到的数据类型是datetime,并不是我们之前模型中的实例化的一个对象,所以无法直接对其添加属性,可以用字典使其与日期一一对应,最后再将字典代替之前Blog.objects.dates(‘created_time’, ‘month’, order=‘DESC’)传递给前端
blog_list.html中对字典for循环遍历要用到此方法:
{% for blog_date, blog_count in blog_dates.items %}
<li><a href="{% url 'blogs_with_date' blog_date.year blog_date.month %}">{{ blog_date|date:"Y年m月"}}({{ blog_count }})</a></li>
{% endfor %}
日期归档数目统计方法2
下面尝试使用与之前博客分类数目方法2类似的方法统计日期归档
python manage.py shell进入shell模式
我们可以看到datetime类型中也有annotate方法,下面尝试应用shell使用此方法:
经过试验发现此方法比之前的方法还要笨重,数据类型之间转换很多次,最后遍历的时候还要每两个为一个单位进行遍历,遂放弃此方法
上一篇: 从零开始的django开发生活之博客阅读计数优化(13)
下一篇: Vuex 的简单应用