Wie in Timedelta django Modell setzen?
Frage
Mit inspectdb konnte ich ein „Intervall“ Feld von Postgres in django bekommen. In Django, es war ein TextField-. Das Objekt, das ich abgerufen war in der Tat ein Timedelta-Objekt!
Jetzt möchte ich in einem neuen Modell dieses Objekt Timedelta setzen. Was ist der beste Weg, dies zu tun? Da setzt ein Timedelta in einem TextField- führt in der str Version des Objekts ...
Lösung
Sie können trivialerweise ein Timedelta zu einem einzigen Gleitkommazahl in Tagen oder Sekunden normalisieren.
Hier ist die "Normalisieren Days" -Version.
float(timedelta.days) + float(timedelta.seconds) / float(86400)
Sie können trivialerweise wiederum eine Gleitkommazahl in ein Timedelta.
>>> datetime.timedelta(2.5)
datetime.timedelta(2, 43200)
So speichern Sie Ihr Timedelta als Schwimmer.
Hier ist die "Normalisieren zu Seconds" Version.
timedelta.days*86400+timedelta.seconds
Hier ist das Gegenteil (mit Sekunden)
datetime.timedelta( someSeconds/86400 )
Andere Tipps
Da Django 1.8 Sie verwenden können, DurationField .
Zunächst definieren Sie Ihr Modell:
class TimeModel(models.Model):
time = models.FloatField()
ein Timedelta-Objekt speichern:
# td is a timedelta object
TimeModel.objects.create(time=td.total_seconds())
Um das Timedelta-Objekt aus der Datenbank zu erhalten:
# Assume the previously created TimeModel object has an id of 1
td = timedelta(seconds=TimeModel.objects.get(id=1).time)
. Hinweis: Ich verwende Python 2.7 für dieses Beispiel
Dieser Link kann hilfreich: Timedelta Snippets
Für PostgreSQL verwenden django-pgsql-Intervall-Feld hier: http : //code.google.com/p/django-pgsql-interval-field/
Es ist ein Ticket, das zurück bis Juli 2006 über diese Termine: https://code.djangoproject.com/ticket/2443
Mehrere Patches geschrieben wurden, aber derjenige, der in einem Projekt gedreht wurde: https://github.com/johnpaulett/django-durationfield
Im Vergleich zu allen anderen Antworten hier dieses Projekt ist ausgereift und zusammengeführt wurde, um Kern würde die Ausnahme, dass die Aufnahme in Betracht gezogen wird derzeit als „bloaty“.
Ich persönlich habe gerade versucht, eine Reihe von Lösungen und das ist die eine, die schön funktioniert.
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
Ergebnis:
$ evt = Event.objects.create(start=datetime.datetime.now(), duration='1 week')
$ evt.finish
Out[]: datetime.datetime(2013, 6, 13, 5, 29, 29, 404753)
Und in Leiter:
Ändern Veranstaltung
Dauer: 7 days, 0:00:00
Setzen dieses da draußen Ursache könnte es eine andere Art und Weise, dieses Problem zu lösen. erste Bibliothek installieren: https://pypi.python.org/pypi/django-timedeltafield
Dann:
import timedelta
class ModelWithTimeDelta(models.Model):
timedeltafield = timedelta.fields.TimedeltaField()
innerhalb des Admin werden Sie gebeten, Daten in das Feld eingeben mit folgendem Format: 3 Tage, 4 Stunden, 2 Minuten