从模型中的时间字段中获取值并对其使用日期时间操作。
Taking value from Timefield in a model and Using datetime operations on it.
我正在应用程序中进行预约功能。为此,我有两个工作班次的开始和结束时间。使用这两个字段的值,我想找到每个班次的总分钟数,然后将其分为半小时时段。我遇到的问题是:
datetime 库期望 datetime 对象评估 timedelta,但我只有 TimeField。如何将 TimeField 转换为 datetime.time 值
模型如下:
class ClinicMembershipAttribute(models.Model):
DAY_CHOICES = (
('Monday', 'Monday'),
('Tuesday', 'Tuesday'),
('Wednesday', 'Wednesday'),
('Thursday', 'Thursday'),
('Friday', 'Friday'),
('Saturday', 'Saturday'),
('Sunday', 'Sunday')
)
clinicmembership = models.ForeignKey(ClinicMembership, null=True, blank=True)
day = models.CharField(choices=DAY_CHOICES, null=True, blank=True, max_length=12)
shift_one_start = models.TimeField(null=True, blank=True)
shift_one_end = models.TimeField(null=True, blank=True)
shift_two_start = models.TimeField(null=True, blank=True)
shift_two_end = models.TimeField(null=True, blank=True)
def get_appointment_status_string(self):
first_shift_delta = (datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_one_end)).time()
second_shift_delta = (datetime.datetime.combine(datetime.date(1,1,1),self.shift_two_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_two_end)).time()
first_shift_seconds = first_shift_delta.seconds()
second_shift_seconds = second_shift_delta.seconds()
def __str__(self):
return self.day + " - '"+str(self.shift_one_start) +" - " + str(self.shift_one_end) + "', '" + str(self.shift_two_start) +" - " + str(self.shift_two_end) + "'"
错误在 first_shift_delta 和 second_shift_delta。
您可以使用文档中的DateTimeField
用于尝试将字符串转换为有效 datetime.datetime 对象的格式列表。
如果未提供 input_formats 参数,则默认输入格式为:
['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y'] # '10/25/06'
尝试更改
shift_one_start = models.TimeField(null=True, blank=True)
到
shift_one_start = models.DateTimeField(null=True, blank=True)
datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_one_end)
return一个datetime.timedelta
对象,你可以用total_seconds()
得到秒然后你可以把它转换成分钟
据我所知,您无需担心将 DateField 转换为 datetime.time 对象。从数据库中获取数据时,Django 会为您制作。为此,TimeField 有 to_python() 方法。
您可以检查 TimeField returns datetime.time 查看 source。
我在您的代码中只看到一个问题。如果 TimeField() 的值为 Null,您将收到错误消息:
combine() argument must be datetime.time, not None.
可能您可以在您的字段中添加 auto_now_add=True
属性并设置 null=False, blank=False
来避免这种情况。
尝试 运行 你的代码 datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start)
必须工作,即使 IDE 说它包含错误。
我正在应用程序中进行预约功能。为此,我有两个工作班次的开始和结束时间。使用这两个字段的值,我想找到每个班次的总分钟数,然后将其分为半小时时段。我遇到的问题是:
datetime 库期望 datetime 对象评估 timedelta,但我只有 TimeField。如何将 TimeField 转换为 datetime.time 值
模型如下:
class ClinicMembershipAttribute(models.Model):
DAY_CHOICES = (
('Monday', 'Monday'),
('Tuesday', 'Tuesday'),
('Wednesday', 'Wednesday'),
('Thursday', 'Thursday'),
('Friday', 'Friday'),
('Saturday', 'Saturday'),
('Sunday', 'Sunday')
)
clinicmembership = models.ForeignKey(ClinicMembership, null=True, blank=True)
day = models.CharField(choices=DAY_CHOICES, null=True, blank=True, max_length=12)
shift_one_start = models.TimeField(null=True, blank=True)
shift_one_end = models.TimeField(null=True, blank=True)
shift_two_start = models.TimeField(null=True, blank=True)
shift_two_end = models.TimeField(null=True, blank=True)
def get_appointment_status_string(self):
first_shift_delta = (datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_one_end)).time()
second_shift_delta = (datetime.datetime.combine(datetime.date(1,1,1),self.shift_two_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_two_end)).time()
first_shift_seconds = first_shift_delta.seconds()
second_shift_seconds = second_shift_delta.seconds()
def __str__(self):
return self.day + " - '"+str(self.shift_one_start) +" - " + str(self.shift_one_end) + "', '" + str(self.shift_two_start) +" - " + str(self.shift_two_end) + "'"
错误在 first_shift_delta 和 second_shift_delta。
您可以使用文档中的DateTimeField
用于尝试将字符串转换为有效 datetime.datetime 对象的格式列表。
如果未提供 input_formats 参数,则默认输入格式为:
['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y'] # '10/25/06'
尝试更改
shift_one_start = models.TimeField(null=True, blank=True)
到
shift_one_start = models.DateTimeField(null=True, blank=True)
datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_one_end)
return一个datetime.timedelta
对象,你可以用total_seconds()
得到秒然后你可以把它转换成分钟
据我所知,您无需担心将 DateField 转换为 datetime.time 对象。从数据库中获取数据时,Django 会为您制作。为此,TimeField 有 to_python() 方法。 您可以检查 TimeField returns datetime.time 查看 source。 我在您的代码中只看到一个问题。如果 TimeField() 的值为 Null,您将收到错误消息:
combine() argument must be datetime.time, not None.
可能您可以在您的字段中添加 auto_now_add=True
属性并设置 null=False, blank=False
来避免这种情况。
尝试 运行 你的代码 datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start)
必须工作,即使 IDE 说它包含错误。