从模型中的Timefield获取值并在其上使用datetime操作。

时间:2016-12-03 06:59:51

标签: python django datetime time timedelta

我在应用中预约预约功能。为此,我有两个工作班次的开始和结束时间。使用这两个字段中的值,我想在每个班次中找到总分钟,然后将其分成半小时的时段。我遇到的问题是:

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。

2 个答案:

答案 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说它包含错误。