【发布时间】:2010-10-01 17:51:21
【问题描述】:
在我正在开发的 Django 应用程序中,我已经完成了:
class Parent(models.Model):
name = models.CharField(...)
def num_children(self):
return Children.objects.filter(parent=self).count()
def avg_child_rating(self):
return Child.objects.filter(parent=self).aggregate(Avg('rating'))
class Child(models.Model):
name = models.CharField(...)
parent = models.ForeignKey(Parent)
rating = models.IntegerField(default=0)
我计划经常访问 avg_child_rating。如果我执行以下操作,是否会优化:
class Parent(models.Model):
...
num_children = models.IntegerField(default=0)
avg_child_rating = models.FloatField(default=0.0)
def update_parent_child_stats(sender, instance, **kwargs):
num_children = Child.objects.filter(parent=instance.parent)
if instance.parent.num_children != num_children:
instance.parent.num_children = num_children
instance.parent.avg_child_rating = Child.objects.filter(instance.parent=self).aggregate(Avg('rating'))
post_save.connect(update_parent_child_stats, sender=Child)
post_delete.connect(update_parent_child_stats, sender=Child)
现在的不同之处在于,每次创建/评级/删除子对象时,都会更新 Parent 对象。我知道创建/评分会经常进行。
还有什么贵?
【问题讨论】:
标签: django database-design django-models django-signals django-aggregation