Какое поле django следует использовать для счетчика времени? АКТУАЛЬНО - PullRequest
1 голос
/ 14 апреля 2020

Мне нужно поле в модели для требуемого рабочего времени. Например, со значением по умолчанию 40 часов. Какое поле мне следует использовать?

UPD

Когда я использую:

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

, я получаю значение 1 16:00:00 вместо 40 часов

PS

У меня уже есть start_time и end_time. Я должен иметь значение для сравнения с end_time - start_time

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

При использовании целочисленной даты я чувствую, что некоторая информация потеряна.

Я бы смоделировал это с work_start_time и work_end_time. Вы можете использовать DateTimeField, установить значения по умолчанию и добавить рассчитанное поле для модели, которая рассчитывает эти две даты для расчета часов. О чем подумать.

1 голос
/ 14 апреля 2020

Вы можете использовать PositiveSmallIntegerField, если планируете хранить целые часы (не минуты, секунды). Как и большинство Django ModelField с, вы можете установить значение по умолчанию (которое, как мне кажется, 40 в вашем случае).

Вы также можете использовать DurationField. Он принимает datetime.timedelta значений. Таким образом, он может хранить дней, часов, секунд.

См. Как использовать DurationField в моей модели? 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)
0 голосов
/ 14 апреля 2020

Вы можете использовать PositiveSmallIntegerField [Django -doc] для хранения маленьких целых чисел. Django гарантирует, что минимальный диапазон составляет:

Как и PositiveIntegerField, но допускает значения только в определенной (зависящей от базы данных) точке. Значения от 0 до 32767 безопасны во всех базах данных, поддерживаемых Django.

Таким образом, количество часов в неделю может быть представлено, поскольку в неделю 168 часов. Furhtmore Django проверит, что число является положительным, что означает, что оно вызовет ошибку в форме, если вы введете отрицательное число.

Кроме того, вы можете обогатить это с помощью валидатора, например:

from django.core.validators import <b>MaxValueValidator</b>

class MyModel(models.Model):
    hours = models.PositiveIntegerField(
        <b>validators=[MaxValueValidator(</b>168, 'There are only 168 hours a week.'<b>)],
        default=40</b>
    )

Здесь будет храниться количество часов в виде целого числа. Это означает, что вы можете хранить 39, 40 или 41, но не 40,5, например.

Для продолжительности c можно использовать DurationField [Django -doc] . При этом значения на уровне Python преобразуются в объекты timedelta, а на уровне базы данных используются interval в базе данных PostgreSQL, Oracle и INTERVAL DAY(9) TO SECOND(6) и т. Д. другие базы данных, он будет за занавесом использовать bigint. Преимущество этого состоит в том, что, таким образом, оно представляет длительность в виде timedelta, что делает удобным, например, выполнение арифметических операций c с datetime объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...