2015-12-03 10 views
6

私はDurationFieldを含むモデルを持っています。正の値がこのフィールドに保存されている場合、正しい結果が得られます。負の値を保存すると、モデルの属性にアクセスしようとすると「なし」が返されます。Django Durationフィールド負の値

class Calendar(models.Model): 
    nominal_actual_comparison = models.DurationField(null=True,blank = True) 

私は、次のようなビューの中に、今それにアクセスしようとしていると、値が負である私はNoneTypeオブジェクトを取得していた場合::

calendar_object = Calendar.objects.get(id = 1) 
calendar_object.nominal_actual_comparison 
モデルは次のようになります

データベースを調べて、DurationFieldBigIntとして保存されていることを確認しました。データベースの値は間違いなく正しいので、DurationFieldの実装にバグがあるのか​​、何か間違っているのでしょうか?代わりに私は何をすることができますか? DurationFieldクラスを上書きしてBigIntがどのようにdatetime.timedeltaオブジェクトに変換されるかを調整できますか?明らかにparse_durationメソッドを呼び出すto_pythonというメソッドを見ましたが、to_pythonメソッドは何とか呼び出されることはありません! 私があなたを助けてくれることを願っております、ありがとうございます!

答えて

1

私はこの間にDurationFieldクラスをオーバーライドしてこの問題を解決しました。 私は自分でBigIntの変換を処理しなければならなかったので、get_db_convertersメソッドを上書きする必要がありました。DurationFieldは負の値を明らかに扱うことができないメソッドparse_datetimeを呼び出します。さらに、データベース値の独自の変換を実装するには、from_db_valueを上書きする必要がありました。 私のDurationFieldのコードは次のようになります:

class DurationField(DurationField): 

def get_db_converters(self, connection): 
    if hasattr(self, 'from_db_value'): 
     return [self.from_db_value] 
    return [] 


def from_db_value(self, value, expression, connection, context): 
    result = "" 

    if (value != None): 
     d = str(decimal.Decimal(value)/decimal.Decimal(1000000)) 
     try: 
      sec = d.split(".")[0] 
      micro_sec = d.split(".")[1] 
     except IndexError: 
      sec = int(d) 
      micro_sec = 0 

     result = self.convertSecondsToTimeDelta(seconds = sec, microseconds = micro_sec) 
     return result 
    else: 
     return None 

def convertSecondsToTimeDelta(self, seconds = 0 , microseconds = 0): 
    return datetime.timedelta(seconds = seconds, microseconds = microseconds) 
関連する問題