Django - 如何在models.py中的类中执行算术运算

时间:2018-04-18 17:17:11

标签: django django-models

我想通过我的等式计算员工的工资

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)

2 个答案:

答案 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)

在回答之前,我想对您的代码做一些观察:

  1. 请勿在{{1​​}}。
  2. 中使用default='0'参数
  3. ForeignKeybase_salary,因此您不应将字符串用作默认值。
  4. 每小时是IntegerField吗?还是每天?还是月?
  5. 我建议使用Djangos timezone代替pythons base_salary库。
  6. 您确定要datetime
  7. 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存储的额外日期信息(例如,DateTimeFieldtime_in在不同的日期,也许是午夜之后)存在并没有什么坏处。

    但是,如果你的双手被绑在这件事上,那么让我们整理出来:

    您看到错误是因为djangos TimeField使用的pythons datetime.time不支持time_out操作。 有关类似的任务,另请参阅this post

    您可以通过转换为-这样的对象来解决这个问题:

    datetime.datetime