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 ...

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top