我的代码工作正常,但是由于我的需求变化,我不得不将DateTimeField设置为TimeField,但在我的代码中进行更改之后,我遇到了以下错误。
异常值:不支持的操作数类型 - :' datetime.time'和' datetime.time'
我的代码是关于工资计算的。
class salary(models.Model):
#employee = models.ForeignKey('employee', on_delete=models.CASCADE)
base_salary = models.IntegerField(default=0)
time_in = models.DateTimeField(default=tz.now, null=True, blank=True)
time_out = models.DateTimeField(default=tz.now, null=True, blank=True)
total_salary = models.CharField(max_length=20, default='0')
def calculate_salary(self):
worked_hours = (self.time_out - self.time_in).total_seconds() / 60 / 60
overtime_hours = 0
# make sure you use timezone aware objects
# https://docs.djangoproject.com/en/2.0/topics/i18n/timezones/#naive-and-aware-datetime-objects
same_day_8pm = self.time_out.replace(hour=16, minute=0, second=0, microsecond=0)
if self.time_out > same_day_8pm:
overtime_hours = (self.time_out - same_day_8pm).total_seconds() / 60 / 60
salary_1 = worked_hours * self.base_salary
salary_2 = overtime_hours * self.base_salary * 0.2
total_salary = salary_1 + salary_2
# careful: this will be a 'float', not an 'int'
# with round() using 0 decimal digits you get an 'int'
# total_salary = round(total_salary, 0)
return total_salary
def save(self,*args,**kwargs):
# are you really sure that you want to save a string ???
self.total_salary = str(self.calculate_salary())
super().save(*args, **kwargs)
答案 0 :(得分:1)
可以减去Python datetime.datetime
个对象,但datetime.time
个对象不能。您可以使用当前日期将它们组合到datetime
个对象中来减去它们(请参阅,例如https://stackoverflow.com/a/5259921/2715819)。具体来说,尝试更改
worked_hours = (self.time_out - self.time_in).total_seconds() / 60 / 60
为:
datetime_in = datetime.combine(date.min, self.time_in)
datetime_out = datetime.combine(date.min, self.time_out)
worked_hours = (datetime_out - datetime_in).total_seconds() / 60 / 60
您还必须在文件顶部添加from datetime import datetime, date
。您还必须将overtime_hours
的计算更改为使用datetime_out
而不是self.time_out
。