2012-11-15 89 views
2

我有兩個模型表示一對多的關係。 InterestRateCurve對象可以有許多InterestRate對象。 問題是,當我有一個函數創建兩條曲線,其中每條曲線有一個速率時,第二條曲線的速率會覆蓋第一條曲線的速率。所以,我最終在數據庫中有兩行曲線和一行速率。 當我執行一個程序保存一個曲線和一個速率,然後執行一個單獨的程序,保存另一個速率的曲線,那就沒有問題。在保存兩個對象時,Django的ForeignKey關係沒有正確保存

我使用Python 2.7和Django 1.4。

機型:

class InterestRate(models.Model): 
    type = models.CharField(max_length=20) 
    term = modelFields.tgTimePeriodField(max_length=20) 
    numTerms = models.IntegerField() 
    mid = models.FloatField() 
    curve = models.ForeignKey('InterestRateCurve') 

    class Meta: 
     unique_together = ('type', 'term', 'numTerms', 'curve') 

    def __unicode__(self): 
     return "%s/%s/%s/%s" % (self.type, self.term, self.numTerms, self.curve) 

    def __str__(self): 
     return "%s/%s/%s/%s/%s" % (self.type, self.term, self.numTerms, self.mid, self.curve) 


class InterestRateCurve(models.Model): 
    ccy = modelFields.tgCurrencyField(max_length=20) 
    index = models.CharField(max_length=20) 
    term = modelFields.tgTimePeriodField(max_length=20) 
    numTerms = models.IntegerField() 
    asOf = modelFields.tgDateField() 
    cvid = models.CharField(max_length=20, blank=True, default='') 
    #rates needs to be explicitly maintained inside class for convenience 
    rates = [] 

    class Meta: 
     unique_together = ('ccy', 'index', 'term', 'numTerms', 'asOf', 'cvid') 

    def __unicode__(self): 
     return "%s/%s/%s/%s/%s/%s" % (self.ccy, self.index, self.term, \ 
             self.numTerms, self.asOf, self.cvid) 

    def save(self): 
     try: 
      curve = InterestRateCurve.objects.get(ccy=self.ccy, index=self.index,\ 
                term=self.term, numTerms=self.numTerms,\ 
                asOf=self.asOf, cvid=self.cvid) 
      #Delete all rates before saving the new rates 
      oldRates = curve.interestrate_set.all() 
      for oldRate in oldRates: 
       oldRate.delete() 
      for rate in self.rates: 
       rate.curve = curve 
       rate.save() 
     except InterestRateCurve.DoesNotExist: 
      super(InterestRateCurve, self).save() 
      curve = InterestRateCurve.objects.get(ccy=self.ccy, index=self.index,\ 
                term=self.term, numTerms=self.numTerms,\ 
                asOf=self.asOf, cvid=self.cvid) 
      for rate in self.rates: 
       rate.curve = curve 
       rate.save() 

    def addRate(self, rate): 
     rate.curve = self 
     exists = False 
     for r in self.rates: 
      if r.type == rate.type: 
       if r.term == rate.term: 
        if r.numTerms == rate.numTerms: 
         exists = True 
         continue 
     if exists == False: 
      self.rates.append(rate) 

下面的代碼工作正常:

 date = tgDate(month=9,day=12,year=2011) 
     curve = InterestRateCurve(ccy='USD', index='LIBOR', term='M', 
            numTerms=3, asOf=self.asOf, cvid='TESTSAVE2CURVES') 
     curve.save() 
     curve = InterestRateCurve.objects.get(ccy='USD', index='LIBOR', term='M', 
               numTerms=3, asOf=date, cvid='TESTSAVE2CURVES') 
     rate = InterestRate(term='M', numTerms=1, type='Deposit', mid=0.01, curve=curve) 
     curve.addRate(rate) 
     curve.save() 

這個執行結果在一個曲線,並存入一個利率。

在一個單獨的執行我運行:

 date = tgDate(month=9,day=13,year=2011) #DATE DIFFERS 
     curve = InterestRateCurve(ccy='USD', index='LIBOR', term='M', 
            numTerms=3, asOf=date, cvid='TESTSAVE2CURVES') 
     curve.save() 
     curve = InterestRateCurve.objects.get(ccy='USD', index='LIBOR', term='M', 
               numTerms=3, asOf=date, cvid='TESTSAVE2CURVES') 
     rate = InterestRate(term='M', numTerms=1, type='Deposit', mid=0.01) 
     curve.addRate(rate) 
     curve.save() 

在另一條曲線這個執行結果和另一率保存。

但是,下面的執行不能正常工作:

def testSave2Curves(self): 
     date = tgDate(month=9,day=12,year=2011) 
     curve = InterestRateCurve(ccy='USD', index='LIBOR', term='M', 
            numTerms=3, asOf=date, cvid='TESTSAVE2CURVES') 
     curve.save() 
     curve = InterestRateCurve.objects.get(ccy='USD', index='LIBOR', term='M', 
               numTerms=3, asOf=date, cvid='TESTSAVE2CURVES') 
     rate = InterestRate(term='M', numTerms=1, type='Deposit', mid=0.01, curve=curve) 
     curve.addRate(rate) 
     curve.save() 
     date1 = tgDate(month=9,day=13,year=2011) 
     curve1 = InterestRateCurve(ccy='USD', index='LIBOR', term='M', 
            numTerms=3, asOf=date1, cvid='TESTSAVE2CURVES') 
     curve1.save() 
     curve1 = InterestRateCurve.objects.get(ccy='USD', index='LIBOR', term='M', 
               numTerms=3, asOf=date1, cvid='TESTSAVE2CURVES') 
     rate1 = InterestRate(term='M', numTerms=1, type='Deposit', mid=0.01) 
     curve1.addRate(rate1) 
     curve1.save() 

這導致在挽救了兩個曲線,但只有一個速度保存。看起來第二種匯率會覆蓋先前保存的第一種匯率。

+0

修復格式。 – rantanplan

+0

對不起,爲什麼是二分率模型,'rate1',而不是'InterestRate(term ='M',numTerms = 1,type ='Deposit',mid = 0.01,curve = curve1)? – LSerni

+0

lserni,你是對的。我複製/粘貼時發生錯誤。它得到了回答和解決。 –

回答

1

問題是規格rates = []作爲類變量InterestRateCurve。由於這個定義,InterestRateCurve的每個對象都訪問相同的費率列表。

在示例中創建第一條曲線和速率後,InterestRateCurve.rates包含創建的速率。然後創建第二條曲線並保存。 InterestRateCurve.save()執行,跳躍在except分支和作用:

for rate in self.rates: 
    rate.curve = curve 
    rate.save() 

記住self.rates(= InterestRateCurve.rates)包含了你的第一個率是多少?循環將此速率的外鍵設置爲第二條曲線並保存。現在你的第一條曲線已經沒有相關的比率了。你的第一條曲線的速度現在屬於第二條曲線。

之後,您將創建與您的第一個速率具有完全相同屬性的第二個速率。由於您在InterestRate型號中指定:

class Meta: 
    unique_together = ('type', 'term', 'numTerms', 'curve') 

......只能有一個具有完全相同屬性的速率。我不確定舊的一個是否被刪除,或者新的未保存。但是,結果是數據庫中只有一個速率對象,屬於第二條曲線。

希望你明白我的意思。你應該看看Python的pdb模塊。這是一個調試器,它允許您逐步執行代碼,並對此類問題非常有幫助。

+0

非常感謝。沒有意識到那個類變量的變化率。它現在有效。 –

相關問題