Django的复杂分组和平均值

时间:2011-12-06 17:38:11

标签: python django django-queryset

我有这样的模型结构:

class Author(models.Model):
   name = models.CharField(max_length=100)
   age = models.IntegerField()

class Book(models.Model):
   published = models.DateTimeField()
   name = models.CharField(max_length=300, unique=True)
   authors = models.ForeignKey(Author)
   category = models.ForeignKey(Category)

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

我想要计算每个作者的Books。这很简单,因为我可以这样做:Author.objects.values('name').annotate(count=Count('book'))

我在计算这些方面遇到了很多困难:

  • 每位作者的唯一类别数。
  • 作者在一个类别中写的平均书籍数
  • (这是一个艰难的。)作者在一个类别中写的第一本书和最后一本书之间的平均持续时间。

我不是ORM查询专家,如果我不得不解决这个问题,我可能最终会使用很多循环和其他迭代来计算这个,但我知道这不是正确的方法来做到这一点

(我知道这种情况下的一些事情很奇怪,例如对作者姓名的一个独特约束,但这是我发现的最好的例子来说明我的问题。)

有关如何实现这一目标的任何帮助?

感谢。

1 个答案:

答案 0 :(得分:2)

哎哟,很难。

由于这些不是您经常需要刷新的信息,我建议您在Author模型中添加3个字段,然后在Book模型上附加post_save信号:每次a本书已创建,您只需计算这些值并将其存储在Author模型中。

然后,您将能够轻松地过滤它们,显示速度非常快,无论如何都会在保存时几乎无法计算出计算时间。