Comment mettre timedelta dans le modèle Django?
Question
Grâce à inspectdb, j'ai pu obtenir un "intervalle". champ de postgres en django. Dans Django, c'était un TextField. L'objet que j'ai récupéré était bien un objet timedelta!
Maintenant, je veux mettre cet objet timedelta dans un nouveau modèle. Quelle est la meilleure façon de faire cela? Parce que placer un timedelta dans un TextField donne la version str de l'objet ...
La solution
Vous pouvez normaliser trivialement un timedelta à un seul nombre à virgule flottante en jours ou en secondes.
Voici le " Normaliser en jours " version.
float(timedelta.days) + float(timedelta.seconds) / float(86400)
Vous pouvez facilement transformer un nombre à virgule flottante en timedelta.
>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)
Alors, stockez votre timedelta en tant que float.
Voici le " Normaliser en secondes " version.
timedelta.days*86400+timedelta.seconds
Voici l'inverse (en secondes)
datetime.timedelta( someSeconds/86400 )
Autres conseils
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)
Remarque: j'utilise Python 2.7 pour cet exemple.
Ce lien peut être utile: Snippets Timedelta
Pour PostgreSQL, utilisez django-pgsql-interval-field ici: http : //code.google.com/p/django-pgsql-interval-field/
Un ticket datant de juillet 2006 concerne: https://code.djangoproject.com/ticket/2443
Plusieurs correctifs ont été écrits, mais celui qui a été transformé en projet: https://github.com/johnpaulett/django-durationfield
Par rapport à toutes les autres réponses ici, ce projet est mature et aurait été fusionné au cœur de la stratégie, à moins que son inclusion ne soit actuellement considérée comme "volumineuse".
Personnellement, je viens d’essayer de nombreuses 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 dans admin:
Modifier l'événement
Durée: 7 jours, 0:00:00
Si vous en faites état, cela pourrait être un autre moyen 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()
dans l’administrateur, il vous sera demandé de saisir des données dans le champ au format suivant: 3 jours, 4 heures, 2 minutes