具有负值的{Django持续时间字段

时间:2015-12-03 15:53:04

标签: python django

我有一个包含DurationField的模型。如果在此字段中保存正值,则会得到正确的结果,如果保存负值,如果我尝试访问模型的属性,则返回“无”。

该模型如下所示:

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

我查看了数据库,发现DurationField已保存为BigInt。数据库中的值肯定是正确的,因此我想知道DurationField的实现是否存在错误,或者我做错了什么?我该怎么做?是否可以覆盖DurationField类以适应BigInt转换为datetime.timedelta对象的方式?我看到了一个名为to_python的方法,它显然调用了parse_duration方法,但to_python方法在某种程度上永远不会被调用! 我希望你能提前帮助我!

1 个答案:

答案 0 :(得分:1)

我在此期间通过覆盖DurationField类解决了这个问题。 我必须自己处理BigInt的转换,因此我必须覆盖get_db_converters方法,因为在原始DurationField中它调用的方法parse_datetime不是&# 39;显然可以处理负值。此外,我不得不覆盖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)