Вот упрощенная версия. моих моделей данных:
Код: Выделить всё
from django.db import models
class Level1(models.Model):
name = models.CharField(max_length=100)
class Level2(models.Model):
level1 = models.ForeignKey(Level1, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
class Level3(models.Model):
level2 = models.ForeignKey(Level2, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
class DataPoint(models.Model):
level3 = models.ForeignKey(Level3, on_delete=models.CASCADE)
value = models.FloatField()
Это означает, что На самом деле мне приходится пересчитывать агрегированные данные уровня только в том случае, если данные с уровня ниже него меняются.
В настоящее время я вычисляю агрегированные данные каждый раз, когда их запрашивают, но это, вероятно, это плохо сказывается на производительности (например, я показываю агрегированные данные нескольких объектов Level1 одновременно, а это значит, что мне приходится выполнять много дорогостоящих вычислений).
Одно из решений, которое Я думаю о том, чтобы использовать сигналы для повторного вычисления агрегированных данных только при необходимости и хранить вычисленные данные где-нибудь в базе данных. Однако недостатком этого является то, что операции записи будут выполняться намного медленнее, поскольку мне придется ждать завершения всех вычислений.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ated-objec