我们有一个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和数据库之间的层。
任何输入都将非常感谢!
答案 0 :(得分:0)
据我所知,您希望对数据库方案进行非规范化以获得最佳查询性能。在这种情况下,我可以推荐专门为此目的而设计的应用程序 - django-composition
正如文件所说:
django-composition提供了从中反规范化数据的抽象方法 您的模型通过特殊的通用模型以简单的声明方式 字段名为CompositionField。
大多数数据非规范化的情况都很常见 django-composition有几个处理最多的“捷径”字段 他们。
CompositionField是django模型字段,提供数据接口 反规范化。
您也可以使用this shortcut ForeignCountField。它有助于计算外键相关的对象数量。