【发布时间】:2017-08-18 14:36:13
【问题描述】:
我已经扩展了datetime.timedelta 之前的一些工作,以更新除法运算符以支持浮点数(在 python 3.x 之前不支持)。在我的一个模型中开始使用 DurationField 之后,我想创建一个自定义版本,它使用我的扩展 timedelta 类,以便查询后返回的对象包括我的自定义 timedelta 类。实现这一点的正确方法是什么?
我一直在编辑DurationField 类本身,同时我想知道如何执行上述操作,然后再进行下一步以了解如何添加自定义模型字段。代码如下(modified Django source code:
class TimeDeltaExtended(datetime.timedelta):
def __div__(self, divisor):
return TimeDeltaExtended(seconds=self.total_seconds()/divisor)
def __mul__(self, multiplier):
return TimeDeltaExtended(seconds=self.total_seconds()*multiplier)
def __add__(self, other):
if isinstance(other, int) and other is 0:
return self
else:
datetime.timedelta.__add__(other)
class DurationField(Field):
...
def to_python(self, value):
if value is None:
return value
if isinstance(value, TimeDeltaExtended):
return value
try:
parsed = parse_duration(value)
except ValueError:
pass
else:
if parsed is not None:
return parsed
raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params={'value': value},
)
...
但是,当我使用此代码查询时,仍会返回正常的 TimeDelta 对象。这甚至是我应该关注的区域吗?
环境 Python 2.7、Django 1.11
【问题讨论】:
-
不幸的是,我不知道,我一直在努力理解这一切是如何联系在一起的,我的编辑基本上是基于虚假的猜测工作!我对 durationfield 类的唯一编辑是添加
TimeDeltaExtended