2012-02-09 58 views
0

我們有一個Dialog和一個Comment對象。我們在Dialog上有一個非規範化的字段num_comments來跟蹤評論的數量。當新評論被保存(或刪除)時,我們想要正確增加/減少此值。count()在post_save中返回零個點擊

# sender=Comment, called post_save and post_delete 
def recalc_comments(sender, instance, created=False, **kwargs): 
    # Comments that will be deleted might not have a dialog (when dialog gets deleted) 
    if not hasattr(instance, "dialog"): 
     return 

    dialog = instance.dialog 
    dialog.update(
     num_comments = sender.public.filter(dialog=dialog).count(), 
     num_commentators = sender.public.filter(dialog=dialog).aggregate(c=Count('user',  distinct=True))["c"], 
) 

已經開始出現的問題是,對於第一條評論發佈,num_comments查詢返回零。這不會每次都發生,只有在aprox的情況下才會發生。 >結果集中的1000條評論(不多,我知道...)。

當count()被執行時,註釋是否還沒有被保存到數據庫?使事情進一步複雜化,我們使用Johnny Cache(和memcached)作爲ORM和數據庫之間的一個層。

任何輸入將不勝感激!

+0

嘗試至少在禁用緩存的情況下進行測試。問題仍然存在嗎? – DrTyrsa 2012-02-09 08:50:16

+0

你可以發佈你的模型,所以我們可以看到問題是否在其他地方? – nicowernli 2012-02-09 15:56:54

回答

0

據我瞭解,您希望對數據庫方案進行非規範化處理以獲得最佳查詢性能。在這種情況下,我可以推薦你的應用程序專門設計用於此目的 - django-composition

由於文檔說:

Django的組成提供了抽象的方式,通過特殊的普通非規範化從 你在簡單的聲明方式模型的數據型號爲 的字段名爲CompositionField。

大多數數據非規範化的情況是很常見的,從而 Django的組合物,處理大部分 幾個「捷徑」領域。

CompositionField是django模型字段,提供數據接口 非規範化。

您也可以使用this shortcut ForeignCountField。它有助於統計外鍵相關的對象數量。