Django使用annotate统计分类文章数量


2020年4月9日 21:15 阅读 733 评论 0 Django

博客一般都有文章分类以及对应文章数量等栏目,这样可以方便读者快速了解博客的规模,那么我们在Django中应该怎么实现呢?

假设我们的博客文章的模型如下

from django.db import models 

class Category(models.Model): 
    name = models.CharField(max_length=20) 

class Article(models.Model): 
    title = models.CharField(max_length=50) 
    content = models.TextField() 
    category = models.ForeignKey(Category) 

    def __str__(self): 
        return self.title 

我们知道从数据库拿出数据都是使用模型管理器 objects 实现的。

比如获取全部分类是:Category.objects.all() ,假设有一个名为 Django 的分类,那么获取该分类的方法是:Category.objects.get(name='Django') 。objects 除了 all、get 等方法外,还有很多操作数据库的方法,而其中有一个 annotate 方法,该方法正可以帮我们实现本文所说的统计分类下文章数量的功能。

代码如下:

from django.db.models.aggregates import Count 
from blog.models import Category 

# Count 计算分类下的文章数,其接受的参数为需要计数的模型的名称 
category_list = Category.objects.annotate(num_posts=Count('article')) 

这里 annotate 不仅从数据库获取了全部分类,相当于使用了 all 方法,它还帮我们为每一个分类添加了一个 num_posts 属性,其值为该分类下的文章数,这样我们在模板中就可以调用这个属性,例如:

% for category in category_list %} 
  <li> 
    <a href="{% url 'category' category.id %}"> 
      {{ category.name }} ({{ category.num_posts }})</a> 
  </li> 
{% endfor %} 

这样实现的效果就是分类名后跟着该分类下的文章数了。

最后修改于2020年4月9日 21:15
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yyqblog.com/article/35.html

微信
支付宝
提交数据中...