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

Django模型在两个DateTimeFields之间的运行时间,django,python-3.x,django-models,Django,Python 3.x,Django Models,我是django的新手,还没有找到一种方法来获取两个DateTimeFields之间的运行时间并将其保存到另一个模型 来自django.db导入模型的 课程时间表(models.Model): startTime=models.DateTimeField(auto\u now\u add=True) endTime=models.DateTimeField(空白=True,空=True) 持续时间=models.datetime字段(endTime-startTime) 定义(自我): 返回s

我是django的新手,还没有找到一种方法来获取两个DateTimeFields之间的运行时间并将其保存到另一个模型

来自django.db导入模型的

课程时间表(models.Model):
startTime=models.DateTimeField(auto\u now\u add=True)
endTime=models.DateTimeField(空白=True,空=True)
持续时间=models.datetime字段(endTime-startTime)
定义(自我):
返回self.startTime
用于计算查询集中每个对象在查询时的
持续时间
字段

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)
可以对注释执行另一个查询集方法,如
filter()
order\u by()
aggregate()
,等等

timesheets.order_by('-duration')  
timesheets.aggregate(Avg('duration')) # {'duration__avg': datetime.timedelta(0, 26473, 292625)} 
用于在查询时计算查询集中每个对象的
持续时间
字段

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)
可以对注释执行另一个查询集方法,如
filter()
order\u by()
aggregate()
,等等

timesheets.order_by('-duration')  
timesheets.aggregate(Avg('duration')) # {'duration__avg': datetime.timedelta(0, 26473, 292625)} 

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

对于相同的功能,我将在模型上使用属性

比如:

@property
def duration(self)
    return self.end_time - self.startime
Lucas有一个使用注释的好主意,但是如果您在某个地方有一个时间表实例,它不是来自该对象管理器,并且以前没有注释过,那么您必须执行单独的数据库命中来实际注释它

该属性的用途如下:

some_timesheet_instance.duration

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

对于相同的功能,我将在模型上使用属性

比如:

@property
def duration(self)
    return self.end_time - self.startime
Lucas有一个使用注释的好主意,但是如果您在某个地方有一个时间表实例,它不是来自该对象管理器,并且以前没有注释过,那么您必须执行单独的数据库命中来实际注释它

该属性的用途如下:

some_timesheet_instance.duration
当你减去两个datetime实例时,你不会得到另一个datetime实例,而是一个instance,这只是两个datetime之间的天、秒和微秒差。不能在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

当你减去两个datetime实例时,你不会得到另一个datetime实例,而是一个instance,这只是两个datetime之间的天、秒和微秒差。不能在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。

我应该将此代码放在哪里?如果我把它放进我的models.py,我会得到一个错误,说模型还没有加载。这会进入我的视图还是我遗漏了什么?执行查询时必须执行此代码(不要放入
models.py
),将在查询时添加
duration
字段我将此代码放置在何处?如果我把它放进我的models.py,我会得到一个错误,说模型还没有加载。这会进入我的视图还是我遗漏了什么?执行查询时必须执行此代码(不要放入
models.py
),将在查询时添加
duration
字段您的意思是需要
duration=endTime-startTime
?您的意思是需要
duration=endTime-startTime