我需要在模型中有一个字段来表示所需的工作时间。例如,默认值为 40 小时。我应该使用哪个字段?
UPD
当我使用:
required_work_hours = models.DurationField(_('Required work hours'), blank=True, null=True,
default=timedelta(hours=40))
我得到的值1 16:00:00
而不是 40 小时
附言
我已经有了start_time
和end_time
.我应该有一个值可以与end_time - start_time
进行比较
如果您计划存储整小时(不是分钟,秒),则可以使用PositiveSmallIntegerField
。像大多数 DjangoModelField
s 一样,您可以设置一个默认值(我猜在您的情况下是 40)。
您也可以使用DurationField
。它接受datetime.timedelta
值。因此,它可以存储数天,数小时,数秒。
请参阅如何在模型中使用持续时间字段?SO 条目用于使用DurationField
.
我已经有了
start_time
和end_time
.
好吧,在这种情况下:假设这两个字段都是类型DateTimeField
,那么end_time - start_time
应该给你datetime.timedelta
实例。然后,可以将此datetime.timedelta
实例转换为小时。
其代码如下:
delta = end_time - start_time
hours = (delta.days * 24) + (delta.seconds // 3600)
使用整数之类的日期,我觉得一些信息丢失了。
我会用work_start_time
和work_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
对象进行算术变得方便。