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 ...
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 )
Depuis Django 1.8 vous pouvez utiliser DurationField .
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.
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
Pour PostgreSQL, utilisez Django-pgsql-interval-field ici: http://code.google.com/p/Django-pgsql-interval-field/
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