Подтвердить что ты не робот

Как поставить timedelta в модели django?

С проверкой я смог получить поле "interval" из postgres в django. В Django это был TextField. Объект, который я получил, действительно был объектом timedelta!

Теперь я хочу поместить этот объект timedelta в новую модель. Какой лучший способ сделать это? Поскольку установка timedelta в TextField приводит к str-версии объекта...

4b9b3361

Ответ 1

Вы можете тривиально нормализовать timedelta до одного числа с плавающей запятой в днях или секундах.

Здесь вариант "Нормализовать до дней".

float(timedelta.days) + float(timedelta.seconds) / float(86400)

Вы можете тривиально превратить число с плавающей запятой в timedelta.

>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)

Итак, сохраните timedelta как float.

Здесь вариант "Нормализовать до секунды".

timedelta.days*86400+timedelta.seconds

Здесь обратное (с использованием секунд)

datetime.timedelta( someSeconds/86400 )

Ответ 2

С Django 1.8 вы можете использовать DurationField.

Ответ 4

Сначала определите свою модель:

class TimeModel(models.Model):
    time = models.FloatField()

Чтобы сохранить объект timedelta:

# td is a timedelta object
TimeModel.objects.create(time=td.total_seconds())

Чтобы получить объект timedelta из базы данных:

# Assume the previously created TimeModel object has an id of 1
td = timedelta(seconds=TimeModel.objects.get(id=1).time)

Примечание: Я использую Python 2.7 для этого примера.

Ответ 7

Существует билет, который относится к июлю 2006 года: https://code.djangoproject.com/ticket/2443

Было написано несколько патчей, но тот, который был включен в проект: https://github.com/johnpaulett/django-durationfield

По сравнению со всеми другими ответами здесь этот проект является зрелым и был бы объединен с ядром, за исключением того, что его включение в настоящее время считается "раздутым".

Лично я просто попробовал кучу решений, и это тот, который прекрасно работает.

from django.db import models
from durationfield.db.models.fields.duration import DurationField

class Event(models.Model):
    start = models.DateTimeField()
    duration = DurationField()

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

Результат:

$ evt = Event.objects.create(start=datetime.datetime.now(), duration='1 week')
$ evt.finish
Out[]: datetime.datetime(2013, 6, 13, 5, 29, 29, 404753)

И в admin:

Изменить событие

Продолжительность: 7 days, 0:00:00

Ответ 8

Полагая это, причина может быть другим способом решить эту проблему. сначала установите эту библиотеку: https://pypi.python.org/pypi/django-timedeltafield

Тогда:

import timedelta

class ModelWithTimeDelta(models.Model):
    timedeltafield = timedelta.fields.TimedeltaField()

внутри администратора вам будет предложено ввести данные в поле в следующем формате: 3 дня, 4 часа, 2 минуты