Python 德扬戈。在数据库中进行复杂的计算

Python 德扬戈。在数据库中进行复杂的计算,python,django,django-models,Python,Django,Django Models,以下是我的模型文件的一部分: class Metric(models.Model): Team = models.ForeignKey(Team) metric_name = models.CharField(max_length = 40) def __unicode__(self): return self.metric_name class Members(models.Model): Metric = models.Foreig

以下是我的模型文件的一部分:

class Metric(models.Model):
    Team = models.ForeignKey(Team)
    metric_name = models.CharField(max_length = 40)
    def __unicode__(self):
            return self.metric_name


class Members(models.Model):
    Metric = models.ForeignKey(Metric, through="Calculate")
    member_name = models.CharField(max_length = 40, null=True, blank=True)
    week_one = models.IntegerField(null=True, blank=True)
    week_two = models.IntegerField(null=True, blank=True)
    week_three = models.IntegerField(null=True, blank=True)
    week_four = models.IntegerField(null=True, blank=True)
    total = models.IntegerField(null=True, blank=True)
    def __unicode__(self):
            return self.member_ID

    def save(self, *args, **kwargs):
            self.total = int(self.week_one)+int(self.week_two)+int(self.week_three)+int(self.week_four)
            super(Members, self).save(*args, **kwargs) # Call the "real" save() method.
现在我想做的是。我想计算每个度量的成员数,一个度量中所有成员的总数,以及一个度量中所有成员中最高的总数

我想不出在Django做这件事的方法。 我想进行这些计算并将其存储在数据库中。 谁能帮我解决这个问题。 谢谢

如果您希望“记忆”这些结果,您至少可以遵循两条路径:

  • Members表上的每行post save触发器,用于更新度量表中的“Members\u count”、“Members\u total”和“Members\u max”字段

    这方面的挑战在于将触发器创建DDL与代码的其余部分一起维护,并在重新创建或更改模型时自动应用它

    Django ORM并没有让这变得特别容易。最常见的迁移工具(south)也没有特意让这变得简单。还请注意,此解决方案将特定于一个RDBMS,某些RDBMS可能不支持此功能

  • 您可以在度量模型中创建“合成”字段,然后在添加或更改成员时使用后期保存信号处理程序来更新这些字段

    class Metric(models.Model):
        Team = models.ForeignKey(Team)
        metric_name = models.CharField(max_length = 40)
    
        members_count = models.IntegerField()
        members_max = models.IntegerField()
        members_total = models.IntegerField()
    
        def __unicode__(self):
            return self.metric_name
    
    # signal handling
    from django.db.models import signals
    from django.dispatch import dispatcher
    
    def members_post_save(sender, instance, signal, *args, **kwargs):
        # Update the count, max, total fields
        met = sender.Metric # sender is an instance of Members
        metric.members_count = Members.objects.filter(Metric=met).count()
        # more code here to do the average etc;
    
    dispatcher.connect(members_post_save, signal=signals.post_save, sender=Members)
    
  • django信号文档可能很有用

    注意事项

  • 虽然这种方法可以实现你的既定目标,但它是脆弱的。您需要有测试覆盖率,以确保此信号处理程序始终启动,即使在您对代码进行了一些重构之后
  • >P>我也会考虑使用“相关对象”查询[EG],假设我们有一个“ME”的度量

    实例。
    >> members_count = me.members_set.count()
    >> # aggregation queries for the total and max
    
    如果不经常使用这些聚合,路径#2可能是一个可行且更易于维护的选项