Python Django模型字段中的子类timedelta
我已经扩展了之前的一些工作,更新除法操作符以支持浮动(在Python3.x之前不支持)。在我的一个模型中开始使用DurationField之后,我想创建一个自定义版本,该版本使用扩展的timedelta类,以便查询后返回的对象包括我的自定义timedelta类。实现这一点的正确方法是什么 我一直在编辑类本身,同时在下一步了解如何添加自定义模型字段之前,我了解了如何执行上述操作。代码如下(: 然而,当我使用这段代码时,查询仍然返回正常的TimeDelta对象。这就是我应该查看的区域吗Python Django模型字段中的子类timedelta,python,django,Python,Django,我已经扩展了之前的一些工作,更新除法操作符以支持浮动(在Python3.x之前不支持)。在我的一个模型中开始使用DurationField之后,我想创建一个自定义版本,该版本使用扩展的timedelta类,以便查询后返回的对象包括我的自定义timedelta类。实现这一点的正确方法是什么 我一直在编辑类本身,同时在下一步了解如何添加自定义模型字段之前,我了解了如何执行上述操作。代码如下(: 然而,当我使用这段代码时,查询仍然返回正常的TimeDelta对象。这就是我应该查看的区域吗 环境Pyth
环境Python 2.7,Django 1.11这是duration字段将如何解析时间增量(seconds=123.456)的序列化形式: 您可以让超类完成繁重的验证、异常处理等工作。只需将其转换为专门的类作为后处理步骤:
>>> class MyDurationField(DurationField):
... def to_python(self, value):
... timedelta = super(MyDurationField, self).to_python(value)
... return TimeDeltaExtended(seconds=timedelta.total_seconds())
...
>>> MyDurationField().to_python('00:02:03.456000')
TimeDeltaExtended(0, 123, 456000)
>>> MyDurationField().to_python('00:02:03.456000') / 2.0
TimeDeltaExtended(0, 61, 728000)
我不知道,不幸的是,我一直在努力理解这一切是如何联系在一起的,我的编辑基本上是基于假想的猜测,最多!我对durationfield类的唯一编辑是添加
TimeDeltaExtended
谢谢,看起来很理想(而且很优雅)。当用作示例时,这对我很有效。但是,当我对包含MyDurationField
的模型运行查询时,该字段仍然由正常的时间增量表示,可能是因为使用了除到\u python
以外的其他函数?您还需要从\u db\u value()定义
这是一种将db返回的值转换为python对象的方法:首先调用super
,然后转换值.Docs。还要注意的是,您应该在to_python
方法中添加大小写value
已经是TimeDeltaExtended
实例。
>>> DurationField().to_python('00:02:03.456000')
datetime.timedelta(0, 123, 456000)
>>> class MyDurationField(DurationField):
... def to_python(self, value):
... timedelta = super(MyDurationField, self).to_python(value)
... return TimeDeltaExtended(seconds=timedelta.total_seconds())
...
>>> MyDurationField().to_python('00:02:03.456000')
TimeDeltaExtended(0, 123, 456000)
>>> MyDurationField().to_python('00:02:03.456000') / 2.0
TimeDeltaExtended(0, 61, 728000)