0

私が取り組んでいる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)

現在の違いは、子が作成/評価/削除されるたびに、親オブジェクトが更新されることです。作成/評価が頻繁に行われることを知っています。

より高価なものは何ですか?

4

1 に答える 1

3

問題の規模によって異なります。大量の書き込みトラフィックが予想される場合は、これが問題になる可能性があります。読み取り(複製、キャッシュなど)よりも書き込みのスケーリングははるかに困難です。とはいえ、この余分なクエリが問題を引き起こすことなく、おそらく長い道のりを進むことができます。

統計がどれだけ最新である必要があるかに応じて、他のプロセス(Web以外のセッション)を実行して、これらの統計を毎晩更新することができます。

于 2009-01-16T01:46:24.550 に答える