跳转到主要内容

用于django模型的TimedeltaField

项目描述

https://drone.io/bitbucket.org/schinckel/django-timedelta-field/status.png

PostgreSQL可以将数据存储为INTERVAL类型,这几乎等同于python的timedelta对象(尽管在某些方面更好)。

我有很多timedelta对象的使用场景,并且代码通常会将整数对象作为秒数包装。此模块将两者结合

  • a timedelta.TimedeltaField()对象,可以透明地转换为datetime.timedelta

  • 将数据存储为PostgreSQL中的INTERVAL,或在其他数据库中的字符串。 (如果将来我使用它们或收到补丁,将考虑其他数据库)。

此包最酷的部分是它处理用户输入字符串的方式以及展示它们的方式。任何符合以下格式的字符串

[X周,] [Y天,] [Z小时,] [A分钟,] [B秒]

都将转换为timedelta对象。即使是缩写版本也可以使用:hrs, hr或h也足够。解析忽略尾随的's',但在向用户展示数据时会智能地添加它们。

要使用,请安装此包,并使用字段

from django.db import models
import timedelta

class MyModel(models.Model):
    the_timedelta = timedelta.fields.TimedeltaField()

在helpers.py中也有一些有用的方法来处理timedelta对象。(例如,乘法、除法、取模和百分比)。

此外,还有两个模板过滤器,分别是 timedeltaiso8601,可以将 timedelta 对象转换为有效的字符串。

示例

事件模型

from django.db import models
import timedelta

class Event(models.Model):
    start = models.DateTimeField()
    duration = timedelta.fields.TimedeltaField()

    @property
    def finish(self):
        return self.start + self.duration

在字段中存储数据

evt = Event.objects.create(
    start=datetime.datetime.now(),
    duration=datetime.timedelta(hours=1)
)
print evt.finish

evt.duration = datetime.timedelta(minutes=3)
print evt.finish

# We can use valid strings of the format described above.
Event.objects.update(duration='2 hours, 45 minutes')

evt = Event.objects.get(pk=evt.pk)
print evt.finish

# We can also assign directly to this field a valid string.
evt.duration = '3 days, 2 hours'
evt.save()

# Note: we need to re-fetch to ensure conversion to timedelta
evt = Event.objects.get(pk=evt.pk)
print evt.finish

与表单一起使用。

您可以直接使用 ModelForm,它将自动选择 TimedeltaFormField,这将处理格式化字符串和 timedelta 对象之间的转换。

或者您可以直接使用表单字段

from django import forms
import timedelta

class EventForm(forms.Form):
    start = forms.DateTimeField()
    duration = timedelta.forms.TimedeltaFormField()

该表单字段将以以下格式显示值

2 day, 3 hours, 1 minute

并将从类似格式解析数据。

查看 tests.py 中的表单字段/小部件输出示例。

助手

nice_repr(timedelta, display='long', sep=', ')

返回一个格式为的字符串

“2周,7小时,1天”

display 可以是字符串 'minimal'、'short' 或 'long' 之一。

iso8601_repr(timedelta, format=None)

返回一个格式为的字符串

“P2WT7H1D”

符合 ISO8601。对于小于一整天的 timedeltas,支持 'alt' 格式

“PT01:02:03”

parse(string)

nice_repr 格式解析字符串。

divide(timedelta, other)

允许将一个 timedelta 除以另一个,或者除以一个整数、浮点数或小数值。

modulo(timedelta, other)

允许对 timedelta 进行模除,或者除以一个整数。

percentage(timedelta, timedelta)

返回第二个 timedelta 占第一个 timedelta 百分比的浮点数。

decimal_percentag(timedelta, timedelta)

返回第二个 timedelta 占第一个 timedelta 百分比的十进制数。

multiply(timedelta, other)

允许将 timedelta 乘以数字。

round_to_nearest(obj, timedelta)

将第一个参数(必须是一个 datetime、time 或 timedelta 对象)四舍五入到第二个参数的最近间隔。

decimal_hours(timedelta)

返回 timedelta 对象所指的小时数的十进制值。

total_seconds(timedelta)

用于处理 python < 2.7 缺乏 timedelta.total_seconds() 的情况的包装器

待办事项

解析 ISO8601 字符串。感谢 Guillame Libersat,我们可以生成它们。

处理包含其他语言时间的字符串。我不是很确定如何做到这一点,但它可能很有用。

变更日志

0.7.10: 修复 Python3/dumpdata 和 None 值的问题。

0.7.9: 更新 PyPI 类别/支持的 Python 版本。

0.7.8: 修复 django 迁移问题。

0.7.7: 模板标签的微小错误修复。

0.7.4: 改进模板标签,以便它们渲染的内容可以被解析。

0.7.3: 错误修复/更多测试。
为 ISO8601 显示添加替代格式:PT00:15:00 等。

请注意,值 > timedelta(1) 可能不会以这种方式显示。

0.7.2: 使 nice_repr 在 timedelta(0) 上的行为更有意义。

感谢 Andy Evan 的报告,以及 Jake Teton-Landis 的修复。

0.7.1: 允许在 timedelta 模板标签的 argument 中使用任意 php-style 字符串。

类似于 django 的日期和时间过滤器。

0.7.0: 支持 django 1.5

0.6.7: 添加 LICENSE 文件。

0.6.6: 添加了几个新的模板过滤器:total_seconds 和 total_seconds_sort。

后者将值填充到 10 位,非常适合词法排序。这可以正确排序长达约 10 年的 timedelta,如果您需要更多,可以传递一个参数给过滤器。

0.6.5: 数据库中的空字符串值现在作为字段的 None 返回。

请注意,您必须将 field.null 设置为 True 才能在数据库中存储 NULL。我仍然不是 100% 满意:postgres 在进行 INTERVAL 比较时可能会对空字符串值感到不适。感谢 Gustavo Dias jaimes 和 reidpr 的报告/修复。

0.6.4: 正确解析 '1w'(之前需要 1wk)。

不要解析像 '1 hs' 这样的内容,需要 '1 hrs'。进行更多测试。

0.6.3: 正确解析 '1h' 为一小时(之前需要 1hr)。

0.6.2: 记得包括 VERSION 号。

0.6.0: 添加 total_seconds 助手(用于 python < 2.7)

0.5.3: 从此文件中包含 long_description。

0.5.2: 添加了 decimal_percentage,它为我们提供了一个 decimal.Decimal 对象。

0.5.1: Mike Fogel 的错误修复。

0.5: Guillaume Libersat 的功能:ISO8601 表示的辅助工具和模板。

croepha 的错误修复:允许 'days' 字符串非复数形式。Guillaume Libersat 的错误修复:如果初始值为 None,则不会崩溃

0.4.7: savemu 的错误修复:使用 unicode() 而不是 str()

0.4.6: 支持PostGIS数据库。

使添加其他数据库的其他列类型更容易。

0.4.5: 恢复 django <1.2 的功能(感谢 Yoav Aner)。

0.4.3: 添加了 helpers.modulo,允许对 timedlelta 对象进行余数除法。

0.4.1: 将 get_db_prep_value() 代码更改为 get_prep_value(),因为我

在 get_default() 中调用它,而没有连接值。

0.4: 将连接和准备好的参数添加到 get_db_prep_value(),

因此 django 1.3+ 不会发出 DeprecationWarnings。

项目详情


下载文件

下载适用于您的平台文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

django-timedeltafield-0.7.10.tar.gz (13.2 kB 查看哈希值)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面