Я хочу представить общую статистику об экземплярах класса "ModelClass" на веб-странице для моих пользователей.Допустим, есть несколько тысяч ModelClass-объектов и есть много статистики, которую мне нужно вычислить.Я понял, что могу сделать это с менеджерами моделей, и вот (очень) упрощенный пример:
class ModelClassCustomManager(models.Manager):
def get_query_set(self):
return super(ModelClassCustomManager, self).get_query_set().filter(is_complete = True)
class ModelClass(models.Model):
is_complete = models.BooleanField(default = False)
...
objects = models.Manager()
complete_objects = ModelClassCustomManager()
Меня беспокоит то, что это истощает много ресурсов, если это вычисляется, когда пользователи просматриваютстр.Поэтому я хотел бы рассчитать его только тогда, когда я изменяю или создаю новые объекты ModelClass, поскольку это единственный раз, когда статистика действительно изменяется.Я думаю, это можно сделать, переопределив метод ModelClass save ().
Каков наилучший способ сохранить эти результаты?Должен ли я создать другую django-модель для хранения вычисленной статистики или есть другой способ хранения этой информации?
РЕДАКТИРОВАТЬ: Спасибо пастилегам за хороший ответ.Однако при таком способе возникают незначительные ошибки, и я решил объяснить их здесь, на случай, если кто-нибудь еще столкнется с этой проблемой.
Прежде всего, я неправильно поместил импорт в ModelClass вверху, поэтому получил круговую зависимость, которая дала странные результаты.Чтобы избавить себя от разочарований, поместите их так, как это делали пастилеги.Во-вторых, чтобы перезаписать предыдущие расчеты статистики (а не создавать новые каждый раз), просто замените
if sender is ModelClass and instance is not Null:
count = ModelClass.objects.all().count()
stat = Stat(name='some_name', value=count).save()
следующим:
if sender is ModelClass:
count = Match.objects.all().count()
try:
stat = Stat.objects.get(key="Total")
stat.update(key="Total", value=count) #Update statistic
except:
Stat(key="Total", value=count).save() #Create new