2009-04-29 13 views
24

इंस्पेक्टडब के साथ मैं पोस्टग्रेस से डीजेंगो में "अंतराल" फ़ील्ड प्राप्त करने में सक्षम था। Django में, यह एक TextField था। जिस वस्तु को मैंने पुनर्प्राप्त किया वह वास्तव में एक टाइमडेल्टा ऑब्जेक्ट था!django मॉडल में timedelta कैसे रखा जाए?

अब मैं इस timedelta ऑब्जेक्ट को एक नए मॉडल में रखना चाहता हूं। ऐसा करने का सबसे अच्छा तरीका क्या है? क्योंकि एक TextField में एक timedelta डाल वस्तु की str संस्करण में परिणाम है ...

उत्तर

27

आप तुच्छता दिन या सेकंड में एक भी फ्लोटिंग प्वाइंट संख्या के लिए एक timedelta को सामान्य कर सकते हैं ।

यहां "सामान्य करने के लिए दिन" संस्करण है।

float(timedelta.days) + float(timedelta.seconds)/float(86400) 

आप एक फ़्लोटिंग-पॉइंट नंबर को ट्वेंडेल्टा में बदल सकते हैं।

>>> datetime.timedelta(2.5) 
datetime.timedelta(2, 43200) 

तो, अपने टाइमडेल्टा को एक फ्लोट के रूप में स्टोर करें।

यहां "सेकेंडलाइज टू सेकेंड" संस्करण है।

timedelta.days*86400+timedelta.seconds 

यहाँ रिवर्स (सेकंड का उपयोग कर)

datetime.timedelta(someSeconds/86400) 
+1

बेशक आप फ्लोट (timedelta.days) + फ्लोट (timedelta.seconds)/फ्लोट (86400) का मतलब है ... लेकिन यह काम करता है! –

+0

@ जैक हा: समस्या को हल करने के लिए धन्यवाद। –

+0

timedelta.days + timedelta.seconds/86400.0 – aehlke

7

पहले, अपने मॉडल को परिभाषित:

class TimeModel(models.Model): 
    time = models.FloatField() 

# td is a timedelta object 
TimeModel.objects.create(time=td.total_seconds()) 

डेटाबेस से बाहर timedelta वस्तु प्राप्त करने के लिए:

# Assume the previously created TimeModel object has an id of 1 
td = timedelta(seconds=TimeModel.objects.get(id=1).time) 

नोट: मैं अजगर 2.7 का उपयोग कर रहा इस उदाहरण के लिए

एक timedelta वस्तु में संग्रह करना।

+1

2.7 से कम संस्करण वाले पायथन पर फॉर्मूला का उपयोग किया जा सकता है: 'total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6)/10 ** 6' – Pol

+0

यह बहुत अच्छा है । संक्षेप में और पूरी तरह से –

3
वहाँ

एक टिकट जो जुलाई 2006 में इस से संबंधित के लिए तारीखों है: https://code.djangoproject.com/ticket/2443

कई पैच लिखा गया था, लेकिन एक है कि एक परियोजना के लिए कर दिया गया था: https://github.com/johnpaulett/django-durationfield

अन्य सभी की तुलना में यहां जवाब दें कि यह परियोजना परिपक्व है और कोर को विलय कर दिया गया है, सिवाय इसके कि इसके समावेशन को वर्तमान में "ब्लॉटी" माना जाता है।

व्यक्तिगत रूप से, मैंने अभी समाधानों का एक गुच्छा करने की कोशिश की है और यह वह है जो खूबसूरती से काम करता है।

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 

परिणाम:

$ evt = Event.objects.create(start=datetime.datetime.now(), duration='1 week') 
$ evt.finish 
Out[]: datetime.datetime(2013, 6, 13, 5, 29, 29, 404753) 

और व्यवस्थापक में:

घटना बदलें

अवधि: 7 days, 0:00:00

+1

दोनों के लिए धन्यवाद, यह Django 1.8 में दिखता है, वह टिकट अंततः बंद हो जाएगा और Django के पास 'अवधि फ़ील्ड' होगा: https://docs.djangoproject.com/en/dev/releases/1.8/# नए डेटा-प्रकार – nnyby

2

इस बाहर लाना इसे करने के लिए एक और तरीका हो सकता है कारण इस समस्या का समाधान निकले। व्यवस्थापक आप निम्नलिखित प्रारूप के साथ क्षेत्र में डेटा दर्ज करने के लिए कहा जाएगा भीतर

import timedelta 

class ModelWithTimeDelta(models.Model): 
    timedeltafield = timedelta.fields.TimedeltaField() 

: https://pypi.python.org/pypi/django-timedeltafield

तब: पहले इस पुस्तकालय स्थापित 3 दिन, 4 घंटे, 2 मिनट

+0

मैं Django 1.7 के साथ इस समाधान को प्राथमिकता देता हूं क्योंकि यह पाइप रेपो में है और बाहरी स्रोत नहीं है। –

54

Django 1.8 के बाद से आप DurationField का उपयोग कर सकते हैं।

संबंधित मुद्दे