2013-10-31 56 views
0

在下面的(超簡化)代碼中,函數get_top_authors()爲我提供了作者列表,每個作者列出其發佈的文章數量,從具有大多數文章的作者排序到作者的文章數量最少,功能get_articles_per_year()給了我一份每年發佈的整篇數據庫文章的清單。在Django中通過M2M字段註釋值和組

如果我想每個作者(或者前五名)每年的文章數量,我可以重新查詢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')) 

回答

0

這裏是我想出了一些更多的閱讀後回答:

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

訣竅是,annotatevalues聚集在團體的價值觀參數的獨特排列形成。在這種情況下,這意味着它會爲每位作者每年添加所有文章。該聲明在M2M表上減少爲一個帶有LEFT OUTER JOIN的查詢,而不是針對每個作者的N個查詢。

相關問題