2009-11-20 47 views
3

显示有关多对多的对象我有新闻和类别一个简单的模型:如何计算并在Django

class Category(models.Model): 
    name = models.CharField() 
    slug = models.SlugField() 

class News(models.Model): 
    category = models.ManyToManyField(Category) 
    title = models.CharField() 
    slug = models.SlugField() 
    text = models.TextField() 
    date = models.DateTimeField() 

我想算新闻为每个类别和网站上显示,像这样:

Sport (5) 
School (4) 
Films (6) 
Computer (2) 
etc... 

我该怎么做?

谢谢!

回答

7

从Django 1.1中检出annotate()函数。

http://docs.djangoproject.com/en/dev/topics/db/aggregation/#topics-db-aggregation

实施例(从该URL以上):

>>> q = Book.objects.annotate(num_authors=Count('authors')) 
>>> q[0].num_authors 
2 
>>> q[1].num_authors 
1 
+0

我想这一点,但我得到AttributeError的: '管理器' 对象没有属性'注释' – Matthew 2009-11-20 22:09:20

+1

好吧,它的工作原理,但我想在类别中计数新闻,而不是新闻中的类别... – Matthew 2009-11-20 22:37:32

+0

Category.objects.all()。annotate(num_news = Count('news_set')) – 2009-11-21 00:16:06

1

很简单:

>>> for category in Category.objects.all(): 
...  print category.name, category.news_set.count() 
+0

这太过分了。 – 2015-09-28 05:31:33