欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从零开始的django开发生活之博客分类统计(10)

程序员文章站 2022-04-24 09:47:53
...

十、博客分类统计

博客分类数目统计方法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模式

从零开始的django开发生活之博客分类统计(10)

我们可以看到datetime类型中也有annotate方法,下面尝试应用shell使用此方法:

从零开始的django开发生活之博客分类统计(10)

经过试验发现此方法比之前的方法还要笨重,数据类型之间转换很多次,最后遍历的时候还要每两个为一个单位进行遍历,遂放弃此方法

相关标签: 网站制作