计算休假天数并在 django 管理模型中显示

Count the leave days and display them in django admin model

我在学django也快一个月了。我创建了一个名为“离开”的模型来标记员工离开。然后我创建了一个名为“Salarie”的模型。在这个模型中,我需要创建一个像“Total_Leave”这样的字段,它将显示一个月内的员工休假计数。(在 2020 年 1 月,特定员工休了多少假)(如果我在工资模型中提到“Employee_Name”作为“Samantha”,它需要显示 samantas 在特定月份,年份的休假)

我试着这样做并尝试了一些编码但没有任何效果。

@property
def Total_Leave(self):
    return self.

谁能解释一下该怎么做?

Models.py

class Leave(models.Model):
    Leave_ID = models.CharField(max_length=5, primary_key=True,default=" ")
    Employee_Name = models.ForeignKey('Employee_Detail',models.DO_NOTHING)
    Dept_Name = models.ForeignKey('Department', models.DO_NOTHING)
    l = (
        ("Paid","Paid"),("Non-Paid","Non-Paid")
    ) 
    Leave_Type = models.CharField(max_length=10, choices= l, default="Non-Paid")
    m = (
        ("January","January"),("February","February"),("March","March"),("April","April"),("May","May"),("June","June"),("July","July"),("August","August"),("September","September"),("October","October"),("November","November"),("December","december")
    )
    Month = models.CharField(max_length=10, choices= m)
    Year = models.IntegerField(max_length=4)
    Start_Date = models.DateField()
    End_Date = models.DateField(null=True, blank = True)
    Reason = models.CharField(max_length=200)
    s = (
       ("Accepted","Accepted"),("Pending","Pending"),("Canceled","Canceled")
    )
    Status = models.CharField(max_length=10, choices= s, default="Pending")


    def __str__(self):
        return str(self.Employee_Name)

class Salarie(models.Model):
    Salarie_ID = models.CharField(max_length=5,primary_key=True,default=" ")
    Employee_Name = models.ForeignKey('Employee_Detail', models.DO_NOTHING)
    Dept_Name = models.ForeignKey('Department', models.DO_NOTHING)
    Basic_Salary = models.IntegerField(default=0)
    Extra_Hours = models.IntegerField(default=0)

    @property
    def Extra_Payment(self):
        return self.Extra_Hours * 350

    Bonus = models.IntegerField(default=0)
    @property
    def Total_Payment(self):
        return self.Extra_Payment + self.Basic_Salary + self.Bonus

    m = (
        ("January","January"),("February","February"),("March","March"),("April","April"),("May","May"),("June","June"),("July","July"),("August","August"),("September","September"),("October","October"),("November","November"),("December","december")
    )
    Month = models.CharField(max_length=10, choices= m)
    Year = models.IntegerField(max_length=4)
    Status = models.BooleanField()
    Paid_Date = models.DateField(null=True,blank=True)

    def __str__(self):
        return str(self.Employee_Name)



class Employee_Detail(models.Model):
    Employee_ID = models.CharField(primary_key=True, max_length=6)
    Employee_Name = models.CharField(unique=True, max_length=30)
    Primary_Phone = models.IntegerField(unique=True, max_length=10)
    p = (
        ("Manager","Manager"),("Supervisor","Supervisor"),("Employee","Employee")
    )
    Position = models.CharField(max_length=15, choices= p, default="Employee")
    Address = models.TextField(max_length=500)
    Email = models.EmailField(max_length=50, unique=True)

    def __str__(self):
        return str(self.Employee_Name)

我试过类似的东西,也许有点用。

def total_leave(emp_name,month,year):
    leaves = Leave.objects.filter(Emp_name= emp_name,Month=month,Year=year)
    Count=0
    for leave in leaves:
        if leaves.status== "Accepted":
            Count +=1
  return Count

比如如果你只需要获取当年的休假计数,只需将年份作为函数的参数即可。

您可以使用 annotateaggregate

来完成此操作

如果你想计算所有员工的休假数,那么

from django.db.models import Count
employees = Employee_Detail.objects.filter(leave__Status='Accepted').annotate(leave_count=Count('leave'))

您可以通过 <employee Obj>.leave_count 访问它 如果您想要所有员工的休假计数 order_by 个月,则

employees = Employee_Detail.objects.filter(leave__Status='Accepted').order_by('leave__Month').annotate(leave_count=Count('leave')).values('leave_Month','leave_count')

最后,您想要特定员工在特定月份的休假计数,而不是在您的员工模型中编写 @属性 函数,如下所示

@property
def get_leave_count(self):
    leaves = Employee_Detail.objects.filter(id=self.id,leave__Status='Accepted').aggregate(leave_count=Count('leave'))
    return leaves['leave_count']

对于月份和年份,请提供月份和年份,然后

month = 'January' #For example    
leaves = Employee_Detail.objects.filter(id=employee_id,leave__Month=month,leave__Status='Accepted').aggregate(leave_count=Count('leave'))
#{'leave_count':3}

year = '2020' #For example    
leaves = Employee_Detail.objects.filter(id=employee_id,leave__Year=year,leave__Status='Accepted').aggregate(leave_count=Count('leave'))
#{'leave_count':13}