كيفية وضع timedelta في نموذج جانغو؟
سؤال
باستخدام 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 دقيقة