Django模型在两个DateTimeFields之间经过的时间

时间:2019-03-13 20:44:59

标签: django python-3.x django-models

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

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

如何使持续时间= endTime-startTime? 我也在使用PostgreSQL数据库。

3 个答案:

答案 0 :(得分:1)

在查询时使用annotate()为查询集中的每个对象计算def listen(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "127.0.0.1" port = 5555 s.bind((host, port)) s.listen(128) while True: print("Waiting for an incoming connection...") c, addr = s.accept() print("GOT CONNECTION FROM", addr) # Serve the connection try: while True: data = c.recv(1024) if len(data) == 0: print("Client closed connection") break data = data.decode("utf-8") data = data.upper() c.send(data.encode("utf-8")) except Exception as e: print("Connection died: {}".format(e)) 字段

duration

可以对诸如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_by()等之类的注释执行另一种查询集方法。

aggregate()

答案 1 :(得分:0)

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

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

类似的东西:

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

Lucas有一个使用注释的好主意,但是如果您有一个Timesheet实例,该实例不是来自该对象管理器的,并且以前没有进行注释,则必须对数据库进行单独的命中才能对其进行实际注释。

此属性的用法如下:

some_timesheet_instance.duration

答案 2 :(得分:0)

duration = timesheet.end_time - timesheet.start_time

当减去两个日期时间实例时,您没有得到另一个日期时间实例,而是一个timedelta实例,这只是两个日期时间之间的天,秒和微秒的差异。您不能将时间增量存储在DateTimefield中,但是可以使用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)

您也可以按照此question中的建议将其存储为FloatField。