从模型中的时间字段中获取值并对其使用日期时间操作。

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