Как поставить timedelta в модели django?
С проверкой я смог получить поле "interval" из postgres в django. В Django это был TextField. Объект, который я получил, действительно был объектом timedelta!
Теперь я хочу поместить этот объект timedelta в новую модель. Какой лучший способ сделать это? Поскольку установка timedelta в TextField приводит к str-версии объекта...
Ответы
Ответ 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.
Ответ 3
https://bitbucket.org/schinckel/django-timedelta-field/src
Ответ 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 для этого примера.
Ответ 5
Эта ссылка может быть полезна: Timedelta Snippets
Ответ 6
Для PostgreSQL используйте django-pgsql-interval-field здесь: http://code.google.com/p/django-pgsql-interval-field/
Ответ 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 минуты