姜戈 |获取每月文章数
Django | Get count of articles per month
我有两个模型 Article 和 Author 是这样实现的:
class Author(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
name = models.CharField(max_length=50)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
pub_date = models.DateField()
在我的模板上,我想绘制一个图表(在前端使用 chart.js)显示过去 12 个月作者每月的出版物。为此,我需要每个月发表的文章数。
这是获取作者文章的查询:
articles = Article.objects.filter(author=author)
获得每月计数的最佳做法是什么?
我考虑过将十二个月中的每个月分别注释到 QuerySet,但还没有找到适合我的方法。
或者,我考虑过在用户浏览器的 JS 站点上处理这个问题。
任何suggestions/recommendations?
如果您需要在 Django 中对数据进行分组,则需要使用 ORM aggregation features。
要在约会时使用它,您可以利用他们的 ORM helper functions。
from django.db.models.functions import TruncMonth
from django.db.models import Count
Article.objects
.filter(author=author) # Filter by the author
.annotate(month=TruncMonth('created')) # Truncate by month and add 'month' to values
.values('month') # Group By month
.annotate(count_id=Count('id')) # Count the number of articles in the grouping
.order_by('-month')[:12] # Sort by months in descending order (latest to earliest) and get the 12 first results
我有两个模型 Article 和 Author 是这样实现的:
class Author(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
name = models.CharField(max_length=50)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
pub_date = models.DateField()
在我的模板上,我想绘制一个图表(在前端使用 chart.js)显示过去 12 个月作者每月的出版物。为此,我需要每个月发表的文章数。
这是获取作者文章的查询:
articles = Article.objects.filter(author=author)
获得每月计数的最佳做法是什么?
我考虑过将十二个月中的每个月分别注释到 QuerySet,但还没有找到适合我的方法。
或者,我考虑过在用户浏览器的 JS 站点上处理这个问题。
任何suggestions/recommendations?
如果您需要在 Django 中对数据进行分组,则需要使用 ORM aggregation features。
要在约会时使用它,您可以利用他们的 ORM helper functions。
from django.db.models.functions import TruncMonth
from django.db.models import Count
Article.objects
.filter(author=author) # Filter by the author
.annotate(month=TruncMonth('created')) # Truncate by month and add 'month' to values
.values('month') # Group By month
.annotate(count_id=Count('id')) # Count the number of articles in the grouping
.order_by('-month')[:12] # Sort by months in descending order (latest to earliest) and get the 12 first results