我想通过我的等式计算员工的工资
total_salary = (time_out - time_in )*base_salary + (time_out - 8PM)*base_salary*0.20
这是我的模特:
class salary(models.Model):
empname = models.ForeignKey('employee1',default='0',on_delete=models.CASCADE)
base_salary = models.IntegerField(default='0', help_text="Base Salary")
time_in = models.DateTimeField(default=datetime.now, blank=True)
time_out = models.DateTimeField(default=datetime.now, blank=True)
total_salary = models.CharField(max_length=20,default='0',blank=True,editable=False)
def default_over_time():
now = datetime.now()
start = now.replace(hour=8, minute=0, second=0, microsecond=0)
return start if start > now else start + timedelta(days=1)
def save(self,*args,**kwargs):
self.total_salary=(self.time_out - self.time_in)
self.total_salary=(self.time_out - self.time_in )* self.base_salary + (self.time_out - self.default_over_time) * self.base_salary*0.20
self.total_salary=str(self.total_salary)
super(salary,self).save(*args,**kwargs)
答案 0 :(得分:0)
我不知道你如何计算基薪的工资,但就你的公式而言self.time_out - self.time_in
它会给你一个日期时间对象。
所以你必须将其转换为秒或小时。喜欢
a1 = self.time_out - self.time_in
total_sec = a1.total_seconds()
self.time_out - self.default_over_time
修改强>
根据您的评论,您必须将时差与时间差转换为小时,然后您必须在公式中使用相同的内容,您可以使用divmod
。
恩。
a1 = self.time_out - self.time_in
total_sec = a1.total_seconds()
minutes,second = divmod(total_sec,60)
hours,minutes = divmod(minutes,60)
从上面你将获得总时数,并可以在你的公式中使用相同的。
编辑2:
将时间转换为日期时间,然后寻求差异。恩。
datetime.strptime(self.time_out.strftime('%H:%I'),'%H:%I') - datetime.strptime(self.time_in.strftime('%H:%I'),'%H:%I')
答案 1 :(得分:0)
在回答之前,我想对您的代码做一些观察:
default='0'
参数
ForeignKey
是base_salary
,因此您不应将字符串用作默认值。IntegerField
吗?还是每天?还是月?timezone
代替pythons base_salary
库。datetime
CharField
吗?
醇>
以下是关于如何计算薪水的建议:
total_salary
在@Ashish发表以下评论后编辑:
我的要求被改变了&我必须将DateTimeField更改为TimeField of timein&超时........但是当我在你给出的答案中做出改变时,我面临一个错误(异常值:不支持的操作数类型 - :'datetime.time'和'datetime.time')
我建议不要在这种情况下使用from datetime import timedelta
from django.db import models
from django.utils import timezone as tz
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=20, 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)
,因为它会使计算更复杂一些。
将TimeField
存储的额外日期信息(例如,DateTimeField
和time_in
在不同的日期,也许是午夜之后)存在并没有什么坏处。
但是,如果你的双手被绑在这件事上,那么让我们整理出来:
您看到错误是因为djangos TimeField
使用的pythons datetime.time
不支持time_out
操作。
有关类似的任务,另请参阅this post。
您可以通过转换为-
这样的对象来解决这个问题:
datetime.datetime