سؤال

باستخدام Inspecdb تمكنت من الحصول على حقل "فاصل زمني" من postgres إلى django.في جانغو، كان TextField.الكائن الذي استردته كان بالفعل كائنًا زمنيًا!

الآن أريد أن أضع كائن timedelta هذا في نموذج جديد.ما هي الطريقة الأفضل لعمل هذا؟لأن وضع timedelta في TextField يؤدي إلى إصدار str للكائن ...

هل كانت مفيدة؟

المحلول

ويمكنك تطبيع مسلي وtimedelta لعدد العائمة نقطة واحدة في أيام أو ثواني.

إليك "تطبيع إلى الأيام" نسخة.

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

ويمكنك تحويل مسلي عدد الفاصلة العائمة في timedelta.

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

وهكذا، تخزين timedelta ك تعويم.

إليك "تطبيع للثواني" نسخة.

timedelta.days*86400+timedelta.seconds

وهنا العكس (باستخدام ثانية)

datetime.timedelta( someSeconds/86400 )

نصائح أخرى

ومنذ جانغو 1.8 يمكنك استخدام DurationField .

أولاً، حدد النموذج الخاص بك:

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

لتخزين كائن timedelta:

# 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)

ملحوظة: أنا أستخدم Python 2.7 لهذا المثال.

وربما يكون هذا الارتباط متعاون: Timedelta القصاصات

لكيو، استخدم جانغو-pgsql الفاصل الزمني حقل هنا: HTTP : //code.google.com/p/django-pgsql-interval-field/

هناك تذكرة يعود تاريخها إلى يوليو 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

ووضع هذا هناك سبب قد يكون وسيلة أخرى لحل هذه المشكلة. أولا تثبيت هذه المكتبة: https://pypi.python.org/pypi/django-timedeltafield

وبعد ذلك:

import timedelta

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

وضمن المشرف سيطلب منك إدخال البيانات في الحقل مع الشكل التالي: 3 أيام، 4 ساعات، 2 دقيقة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top