2012-10-12 81 views
0

做複雜的計算,這是我的模型文件的一部分:Django。在數據庫

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中做到這一點的一種方法。 我想做這些計算並將它們存儲在數據庫中。 任何人都可以請幫我解決這個問題。 感謝

回答

0

如果你想「memoize的」這些結果,至少有兩條路徑,你可以遵循:

  1. 按行後保存觸發的成員表更新「MEMBERS_COUNT Metric「表中的」members_total「和」members_max「字段。

    與此相關的挑戰在於維護觸發器創建DDL以及其他代碼,並在模型重新創建或更改時自動應用它。

    Django ORM不會讓這特別容易。最常用的遷移工具(南部)也不會爲此變得容易。還要注意,這個解決方案將特定於一個RDBMS,並且一些RDBMS可能不支持這種解決方案。

  2. 您可以在Metric模型中創建「合成」字段,然後使用保存後信號處理程序在成員添加或更改時更新它們。

    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的信號文檔here可以使用的。

注意事項

  1. 雖然這種方法可爲實現您的既定目標,它是易碎的。您需要測試覆蓋範圍,以確保此信號處理程序始終會觸發,即使您已對代碼進行了一些重構。
  2. 我也考慮使用「相關對象」查詢,例如[在https://docs.djangoproject.com/en/dev/topics/db/queries/#related-objects記錄],假設我們有公制

    >> members_count = me.members_set.count() 
    >> # aggregation queries for the total and max 
    

的「我」的實例。如果這些總額不經常使用,路徑#2可能是一個可行且更易維護的選項。