Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型字段中的子类timedelta_Python_Django - Fatal编程技术网

Python Django模型字段中的子类timedelta

Python Django模型字段中的子类timedelta,python,django,Python,Django,我已经扩展了之前的一些工作,更新除法操作符以支持浮动(在Python3.x之前不支持)。在我的一个模型中开始使用DurationField之后,我想创建一个自定义版本,该版本使用扩展的timedelta类,以便查询后返回的对象包括我的自定义timedelta类。实现这一点的正确方法是什么 我一直在编辑类本身,同时在下一步了解如何添加自定义模型字段之前,我了解了如何执行上述操作。代码如下(: 然而,当我使用这段代码时,查询仍然返回正常的TimeDelta对象。这就是我应该查看的区域吗 环境Pyth

我已经扩展了之前的一些工作,更新除法操作符以支持浮动(在Python3.x之前不支持)。在我的一个模型中开始使用DurationField之后,我想创建一个自定义版本,该版本使用扩展的timedelta类,以便查询后返回的对象包括我的自定义timedelta类。实现这一点的正确方法是什么

我一直在编辑类本身,同时在下一步了解如何添加自定义模型字段之前,我了解了如何执行上述操作。代码如下(:

然而,当我使用这段代码时,查询仍然返回正常的TimeDelta对象。这就是我应该查看的区域吗


环境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)