Django:随着时间的推移存储db查询变量并将其显示为图形

时间:2018-04-06 07:24:33

标签: django

我正在构建一个可用作仪表板的应用程序。用户将能够创建,更新,删除合同。合同模型的一部分如下所示:

class Contract(models.Model):
   ...
   contract_date = models.DateField()
   contract_expires = models.DateField(null=True)
   contract_length = models.IntegerField(null=True, blank=True)

   def __str__(self):
       return str(self.customer)

   def save(self, *args, **kwargs):
       self.contract_length = (self.contract_expires - self.contract_date).days
       return super(Contract, self).save(*args, **kwargs)

我还向每个用户显示有关合同的以下信息:

contracts_qty = Contract.objects.filter(customer__department__in=[selected_department]).count()
contracts_sum_total = Contract.objects.filter(customer__department__in=[selected_department]).aggregate(Sum('contract_sum'))['contract_sum__sum']
contracts_sum_avg = Contract.objects.filter(customer__department__in=[selected_department]).aggregate(Avg('contract_sum'))['contract_sum__avg']
contract_length_avg = Contract.objects.filter(customer__department__in=[selected_department]).aggregate(Avg('contract_length'))['contract_length__avg']

我还想显示每个指标随时间的发展情况,例如向用户显示每个指标的图表。我该怎么做呢?

我在想,也许我可以使用查询变量(contracts_qty等)创建模型,并在每次创建,更新或删除合约时使用Django Signals存储实例,或者每月自动保存一次实例。

这是解决这个问题的正确方法,还是我离开了?

谢谢..

1 个答案:

答案 0 :(得分:0)

存储计算字段不是一个好习惯,除非它是唯一的方法,例如,超越性能问题。在你的情况下,我认为你不会遇到表演问题。 我会做的是创建一个django Manager,其中包含了为图形提供所需的方法,我会不时地将它们称为视图。 它将简单,优雅,并且易于扩展,以防您显示越来越多的ometrics表。