我有一个包含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
方法在某种程度上永远不会被调用!
我希望你能提前帮助我!
答案 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)