我在应用中预约预约功能。为此,我有两个工作班次的开始和结束时间。使用这两个字段中的值,我想在每个班次中找到总分钟,然后将其分成半小时的时段。我遇到的问题是:
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。
答案 0 :(得分:0)
您可以使用文档中的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)
答案 1 :(得分:0)
据我所知,您不必担心将DateField转换为datetime.time对象。当从DB获取数据时,Django将为您提供。为此,TimeField具有to_python()方法。 您可以检查TimeField是否返回datetime.time,查看source。 我看到你的代码中只有一个问题。如果TimeField()的值为Null,您将收到错误消息:
combine() argument must be datetime.time, not None.
Probaly您可以在字段中添加auto_now_add=True
属性,并设置null=False, blank=False
以避免出现这种情况。
尝试运行代码datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start)
必须工作,即使IDE说它包含错误。