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

计算休假天数并在django管理模型中显示,django,django-aggregation,Django,Django Aggregation,我现在正在学习django或一个月。我创建了一个名为“休假”的模型来标记员工的休假。然后,我创建了一个名为“Salarie”的模型。在这个模型中,我需要创建一个类似“Total_Leave”的字段,它将显示员工一个月内的休假计数。(2020年1月,某个员工休了多少假)(如果我在薪资模型中提到“employee_Name”作为“Samantha”,它需要显示samantas在特定月份、年份的休假) 我试着这样做,并尝试了一些编码,但没有任何效果 @property def Total_Leave(

我现在正在学习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

例如,如果您只需要获取该年的休假计数,只需将该年用作函数的参数。

您可以使用
注释或
聚合来完成此操作

如果你想让所有员工都休假,那么

from django.db.models import Count
employees = Employee_Detail.objects.filter(leave__Status='Accepted').annotate(leave_count=Count('leave'))
您可以通过
访问此项。离开计数
如果您希望每月对所有员工订单进行休假计数

employees = Employee_Detail.objects.filter(leave__Status='Accepted').order_by('leave__Month').annotate(leave_count=Count('leave')).values('leave_Month','leave_count')
最后一次,您希望特定员工在特定月份的休假计数,而不是在您的员工模型write@property函数中,如下所示

@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}

你的员工详细模型在哪里?@SST Employee\u Detail model addedSir,我只想添加@property function。我还需要做前面的编码吗?不,你不需要,但在property function中,你不能传递像month and year这样的参数,它会给你结果,包括所有的month and year值如果你想传递month and year进行过滤,然后删除@property decoratorSir,我按照你说的做了@property函数,然后我为员工添加了假期。但仍有Get\u leave\u计数显示为空。我是一个初学者,你能解释一下过滤后的更深入的检查你是否得到了记录吗