python - Django 模型字段中的子类 timedelta

标签 python django

我已经扩展了datetime.timedelta对于之前的一些更新除法运算符以支持 float 的工作(在 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

最佳答案

这就是持续时间字段如何解析 timedelta(seconds=123.456) 的序列化形式:

>>> DurationField().to_python('00:02:03.456000')
datetime.timedelta(0, 123, 456000)

您可以让父类(super class)完成验证、异常处理等繁重的工作。只需将转换为您的专用类作为后处理步骤:

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

关于python - Django 模型字段中的子类 timedelta,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45759249/

相关文章:

python - 带有 contrib 的 OpenCV 3.0 Windows 二进制安装

python - heroku django south 似乎没有使用迁移

Django 迁移错误 :you cannot alter to or from M2M fields, 或添加或删除 through= on M2M 字段

python - 如何从 Django 数据库中获取一定数量的元素

django - django原始查询参数的问题

python - sphinx-apidoc 用法 - 多个源 python 目录

android - Kivy 中的 HTTPS 请求

python - 如何在 instapy 中配置代理

python - 如何呈现其中包含 UTF8 字符的 Django 模板?

python - 如何在 FreeBSD 中打开 PostgreSQL 的 psql 提示符?