哪个 django 字段应该用于时间计数器?实际



我需要在模型中有一个字段来表示所需的工作时间。例如,默认值为 40 小时。我应该使用哪个字段?

UPD

当我使用:

required_work_hours = models.DurationField(_('Required work hours'), blank=True, null=True,
default=timedelta(hours=40))

我得到的值1 16:00:00而不是 40 小时

附言

我已经有了start_timeend_time.我应该有一个值可以与end_time - start_time进行比较

如果您计划存储整小时(不是分钟,秒),则可以使用PositiveSmallIntegerField。像大多数 DjangoModelFields 一样,您可以设置一个默认值(我猜在您的情况下是 40)。

您也可以使用DurationField。它接受datetime.timedelta值。因此,它可以存储数天,数小时,数秒。

请参阅如何在模型中使用持续时间字段?SO 条目用于使用DurationField.

我已经有了start_timeend_time.

好吧,在这种情况下:假设这两个字段都是类型DateTimeField,那么end_time - start_time应该给你datetime.timedelta实例。然后,可以将此datetime.timedelta实例转换为小时。

其代码如下:

delta = end_time - start_time
hours = (delta.days * 24) + (delta.seconds // 3600)

使用整数之类的日期,我觉得一些信息丢失了。

我会用work_start_timework_end_time建模。您可以使用DateTimeField,设置默认值,并在模型上添加一个计算文件,该字段查看这两个日期来计算小时数。要考虑的事情。

你可以使用PositiveSmallIntegerField[Django-doc]来存储小整数。Django 保证最小范围是:

PositiveIntegerField类似,但只允许某个(依赖于数据库的)点下的值。从 0 到 32767 的值在 Django 支持的所有数据库中都是安全的。

因此,可以表示每周的小时数,因为每周有 168 小时。Furhtmore Django 将验证该数字是否为正数,这意味着如果您输入负数,它将在表单中引发错误。

您还可以使用验证器来丰富它,例如:

from django.core.validators importMaxValueValidator
class MyModel(models.Model):
hours = models.PositiveIntegerField(
validators=[MaxValueValidator(168, 'There are only 168 hours a week.')],
default=40
)

因此,它将小时数存储为整数。这意味着您可以存储 39、40 或 41,但不能存储 40.5。

对于通用持续时间,您可以使用DurationField[Django-doc]。这会将 Python 级别的值转换为timedelta对象,而在数据库级别,它在PostgreSQL数据库、Oracle 和INTERVAL DAY(9) TO SECOND(6)上使用interval,在其他数据库上,它将在幕后使用bigint。这样做的好处是,它因此将持续时间表示为timedelta,这使得例如对datetime对象进行算术变得方便。

最新更新