Py学习  »  Django

Django模型两个DateTimeFields之间的运行时间

Jaxson Mansouri • 5 年前 • 1306 次点击  

我对django很陌生,还没有找到一种方法来获取两个datetimefield之间经过的时间并将其保存到另一个模型。

from django.db import models



class Timesheet(models.Model):
    startTime = models.DateTimeField(auto_now_add=True)
    endTime = models.DateTimeField(blank=True, null=True)
    duration = models.DateTimeField(endTime - startTime)

    def _str_(self):
        return self.startTime

如何使duration=endtime-starttime? 我也在使用postgresql数据库。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40523
 
1306 次点击  
文章 [ 3 ]  |  最新文章 5 年前
Pedro
Reply   •   1 楼
Pedro    6 年前
duration = timesheet.end_time - timesheet.start_time

当您减去两个datetime实例时,您不会得到另一个datetime实例,但是 timedelta instace,这只是两个日期之间的天、秒和微秒差。不能在DateTimeField中存储TimeDelta,但可以使用IntegerField,例如:

days_in_seconds = duration.days * 86400   # days difference by seconds in a day
duration_in_seconds = duration.seconds + days_in_seconds  # duration in seconds

当您想以timedelta形式访问持续时间时,只需执行以下操作:

import datetime

duration = datetime.timedelta(seconds=timesheet.duration)

您还可以将其存储为floatfield,如下所示 question .

Lucas Weyne
Reply   •   2 楼
Lucas Weyne    6 年前

使用 annotate() 计算 duration 查询时QuerySet中每个对象的字段

from django.db.models import F, ExpressionWrapper, fields    

timesheets = Timesheet.objects.annotate(
    duration=ExpressionWrapper(
        F('endTime') - F('startTime'),
        output_field=fields.DurationField()
    )
)

timesheets[0].duration  # datetime.timedelta(0, 722, 18373)

可以对注释执行另一个queryset方法,如 filter() , order_by() , aggregate() 等。

timesheets.order_by('-duration')  
timesheets.aggregate(Avg('duration')) # {'duration__avg': datetime.timedelta(0, 26473, 292625)} 
Art Vandelay
Reply   •   3 楼
Art Vandelay    6 年前

在此期间,我不会使用专用的模型字段。

我将在模型上使用一个属性来代替相同的功能。

类似于:

@property
def duration(self)
    return self.end_time - self.startime

lucas有一个使用注释的好主意,但是如果您在某个地方有一个时间表实例,它不是来自那个对象管理器,并且以前没有被注释过,那么您必须执行一个单独的数据库命中来实际注释它。

此属性的用法如下:

some_timesheet_instance.duration