zoukankan      html  css  js  c++  java
  • 博客分类统计

    博客类型模型

    class BlogType(models.Model):
    type_name = models.CharField(max_length=15)

    def __str__(self):
    return self.type_name

    第一种方法

    #获取博客分类的对应博客数量
    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) #保存到列表中

    context = {}
    context['blog_types'] = blog_types_list
    {% for blog_type in blog_types %}
    <li>
    <a href="{% url 'blogs_with_type' blog_type.pk %}">
    {{ blog_type.type_name }}({{ blog_type.blog_count }})
    </a>
    </li>
    {% empty %}
    <li>暂无分类</li>
    {% endfor %}
    前端页面可以调用新加的属性。

    第二种方法
    annotate注释,使用annotate拓展查询字段,就是给遍历出来模型对象写一条备注之类的信息
    from django.db.models import Count
    context['blog_types'] = BlogType.objects.annotate(blog_count=Count('blog'))
    count中写与BlogType关联的模型的类名的小写。实现的结果与上面一种方法一样,但是原理不同。
    感觉很像依据博客类型对博客进行统计



    日期归档统计
    Blog.objects.dates('created_time', 'month', order='DESC')#返回日期数据

    <QuerySet [datetime.date(2020, 10, 1)]>
    #获取日期归档对应的博客数量
    blog_dates = Blog.objects.dates('created_time', 'month', order='DESC') #获取每月日期数据
    blog_dates_dict = {} #创建空字典
    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 #日期为键,数量为值。保持在字典中

    context = {}
    context['blog_dates'] = blog_dates_dict

    前端
    {% 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 %}

    字典.items遍历键和值。

    第二种

    >>> from django.db.models import Count
    >>> Blog.objects.dates('created_time', 'month', order='DESC')
    <QuerySet [datetime.date(2020, 10, 1)]>
    >>> Blog.objects.dates('created_time', 'month', order='DESC').annotate(blog_count=Count('created_time'))
    <QuerySet [datetime.date(2020, 10, 1), 34]>
    >>> ds1=Blog.objects.dates('created_time', 'month', order='DESC').annotate(blog_count=Count('created_time'))
    >>> ds1[0]
    datetime.date(2020, 10, 1)
    >>> ds1[1]
    Traceback (most recent call last):

    >>> ds2=list(ds1)
    >>> ds2
    [datetime.date(2020, 10, 1), 34]
    >>> ds2[1]
    34

    在views中通过切片把对应的值放到字典中,再传回前端页面也可行,不过比第一种方法看起来复杂。



  • 相关阅读:
    页面内容[置顶] 采用Div+Css布局——牛腩
    区域函数[置顶] linux 3.4.10 内核内存管理源代码分析5:伙伴系统初始化
    安装应用android批量安装APK
    选择版本Win7系统VS2010下搭建qt开发环境
    字体格式The format of Oracle tnsnames.ora file
    程序执行vhdl中延时器的编写
    概率链接nbu 2416 奇怪的散步
    中国主题ASP.Net课堂实验4
    要求终点HDU1010:Tempter of the Bone
    解决方案编程苦B和二B程序员别忘了养生
  • 原文地址:https://www.cnblogs.com/lag1/p/13823946.html
Copyright © 2011-2022 走看看