我对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数据库。
答案 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。