【问题标题】:Count the leave days and display them in django admin model计算休假天数并在 django admin 模型中显示
【发布时间】:2020-07-28 07:04:33
【问题描述】:

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

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

@property
def Total_Leave(self):
    return self.

谁能解释一下怎么做?

模型.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)

【问题讨论】:

  • 您的 Employee_Detail 模型在哪里?
  • @SST Employee_Detail 模型添加

标签: django django-aggregation


【解决方案1】:

您可以使用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 Month 的休假计数,那么

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

最后,您希望特定员工在特定月份的休假计数,而不是在员工模型中编写这样的 @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}

【讨论】:

  • 先生,我只想添加@property函数。是否也需要做之前的编码?
  • 不,你不需要,但是在属性函数中,你不能传递像月份和年份这样的参数,它会给你结果,包括所有月份和年份的值
  • 如果你想传递月份和年份进行过滤,然后删除 @property 装饰器
  • 先生,我按照您所说的执行了@property 功能,然后我为员工添加了休假。但是 Get_leave_count 仍然显示为空。我是初学者,能不能解释的更深入一点
  • 过滤后检查是否获取记录
【解决方案2】:

我试过这样的东西,也许有一些用处。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2017-09-14
    • 2016-04-23
    • 1970-01-01
    • 2013-08-28
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多