2011-12-06 85 views
4

我有一個這樣的模型結構:複雜的分組和平均在Django

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

哎唷,硬的。

因爲這些都不是你需要經常刷新的信息,我建議你加3場到Author模型,然後裝上Book模型post_save信號:每次一本書被創建的時候,你纔算這些值並將它們存儲在Author模型中。

然後您就可以很容易地對它們進行過濾,顯示速度會非常快,而且無論如何要進行保存時,計算它的時間幾乎是不可知的。