count()在post_save中返回零命中

时间:2012-02-09 08:47:57

标签: django signals

我们有一个Dialog和一个Comment对象。我们在Dialog上有一个非规范化字段num_comments来跟踪注释的数量。当保存(或删除)新评论时,我们希望正确地增加/减少此值。

# 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和数据库之间的层。

任何输入都将非常感谢!

1 个答案:

答案 0 :(得分:0)

据我所知,您希望对数据库方案进行非规范化以获得最佳查询性能。在这种情况下,我可以推荐专门为此目的而设计的应用程序 - django-composition

正如文件所说:

  

django-composition提供了从中反规范化数据的抽象方法   您的模型通过特殊的通用模型以简单的声明方式   字段名为CompositionField。

     

大多数数据非规范化的情况都很常见   django-composition有几个处理最多的“捷径”字段   他们。

     

CompositionField是django模型字段,提供数据接口   反规范化。

您也可以使用this shortcut ForeignCountField。它有助于计算外键相关的对象数量。