web-dev-qa-db-fra.com

Comment mettre timedelta dans le modèle Django?

Avec inspectdb, j'ai pu obtenir un champ "intervalle" de postgres dans Django. À Django, c'était un TextField. L'objet que j'ai récupéré était en effet un objet timedelta!

Maintenant, je veux mettre cet objet timedelta dans un nouveau modèle. Quelle est la meilleure façon de procéder? Parce que mettre un timedelta dans un TextField entraîne la version str de l'objet ...

39
Jack Ha

Vous pouvez normaliser trivialement un timedelta à un seul nombre à virgule flottante en jours ou en secondes.

Voici la version "Normaliser en jours".

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

Vous pouvez transformer trivialement un nombre à virgule flottante en timedelta.

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

Alors, stockez votre timedelta sous forme de flotteur.

Voici la version "Normaliser en secondes".

timedelta.days*86400+timedelta.seconds

Voici l'inverse (en utilisant les secondes)

datetime.timedelta( someSeconds/86400 )
31
S.Lott

Depuis Django 1.8 vous pouvez utiliser DurationField .

87
Marc Tudurí
8
Python

Définissez d'abord votre modèle:

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

Pour stocker un objet timedelta:

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

Pour extraire l'objet timedelta de la base de données:

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

Note: J'utilise Python 2.7 pour cet exemple.

7
Garrett Hyde

Il existe un ticket qui remonte à juillet 2006 à ce sujet: https://code.djangoproject.com/ticket/244

Plusieurs correctifs ont été écrits mais celui qui a été transformé en projet: https://github.com/johnpaulett/Django-durationfield

Comparé à toutes les autres réponses ici, ce projet est mature et aurait été fusionné au cœur, sauf que son inclusion est actuellement considérée comme "gonflée".

Personnellement, je viens d'essayer un tas de solutions et c'est celle qui fonctionne à merveille.

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

Résultat:

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

Et en admin:

Modifier l'événement

Durée: 7 days, 0:00:00

4
Williams

Pour PostgreSQL, utilisez Django-pgsql-interval-field ici: http://code.google.com/p/Django-pgsql-interval-field/

3
dotz

Mettre cela là-bas parce que cela pourrait être une autre façon de résoudre ce problème. installez d'abord cette bibliothèque: https://pypi.python.org/pypi/Django-timedeltafield

Ensuite:

import timedelta

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

au sein de l'administrateur, il vous sera demandé de saisir des données dans le champ au format suivant: 3 jours, 4 heures, 2 minutes

2
colins44