Django模型在两个DateTimeFields之间的运行时间
我是django的新手,还没有找到一种方法来获取两个DateTimeFields之间的运行时间并将其保存到另一个模型 来自django.db导入模型的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
课程时间表(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
?