0

在下面的(超级简化的)代码中,函数get_top_authors()给了我作者列表,每个人都有他们发表的文章的数量,从发表文章最多的作者到发表文章最少的作者排序,函数get_articles_per_year()给我一个列表整个数据库每年发表的文章总数。

如果我想要 N 个作者(或前 5 个作者)中每个作者每年的文章数量,我可以重做 N(或 5)次查询。但是,有没有更有效的方法来做到这一点?

from django.db import models

class Author:
    name = models.TextField()

class Article:
    author = models.ManyToManyField(Author)
    year = models.IntegerField()

def get_top_authors():
    top_authors = Author.objects.all() \
        .annotate(articles=models.Count('article')).order_by('-articles')

def get_articles_per_year():
    return Article.objects.all()
        .values('year').order_by('year') \
        .annotate(articles=models.Count('year'))
4

1 回答 1

2

这是我在阅读更多内容后得出的答案:

articles_per_author_per_year = Article.objects.all() \
    .values('year', 'authors_name').order_by('year')\
    .annotate(articles=models.Count('id'))

诀窍是在对由值参数的唯一排列形成的组进行聚合annotate之后。values在这种情况下,这意味着它将把每位作者每年的所有文章加起来。该语句减少了LEFT OUTER JOIN对 M2M 表的一个查询,而不是对每个作者的 N 个查询。

于 2013-11-09T09:00:59.870 回答