Как поставить timedelta в модели Django? - PullRequest
32 голосов
/ 29 апреля 2009

С помощью inspectdb мне удалось получить поле «интервал» из postgres в django. В Django это был TextField. Объект, который я нашел, действительно был объектом timedelta!

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

Ответы [ 8 ]

73 голосов
/ 08 апреля 2015

Начиная с Django 1.8 вы можете использовать DurationField .

29 голосов
/ 29 апреля 2009

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

Вот версия "Нормализовать по дням".

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

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

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

Итак, храните вашу таймделту в виде поплавка.

Вот версия «Нормализовать до секунд».

timedelta.days*86400+timedelta.seconds

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

datetime.timedelta( someSeconds/86400 )
7 голосов
/ 14 мая 2012

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

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 голосов
/ 16 апреля 2011
3 голосов
/ 06 июня 2013

Существует билет, который датируется июлем 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)

А в админке:

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

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

3 голосов
/ 25 июля 2010

Для PostgreSQL используйте django-pgsql-interval-field здесь: http://code.google.com/p/django-pgsql-interval-field/

3 голосов
/ 29 апреля 2009

Эта ссылка может быть полезной: Timedelta Snippets

2 голосов
/ 03 марта 2015

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

Тогда:

import timedelta

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

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

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