社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Jaxson Mansouri • 5 年前 • 1302 次点击  

我对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
 
1302 次点击  
文章 [ 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