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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top