2017-09-14 62 views
0

我有员工和每个人应用的休闲,病假,假期,产假,陪产假类型的叶子...我想为每个员工包含叶数批准不同的表排除leave_types周六,周日在目前的2017年Django:查询总数根据类型

Eg: 
person 1 applied sick leave from 11th sept,Mon 2017 to 13 sept,Wed 2017--3 days 
person 1 applied sick leave from 14th sept,Thu 2017 to 15 sept,Fri 2017--2 days 

person 1 applied Casual leave from 14th ,Thu 2017 to 15 sept,Fri 2017--2 days 
person 1 applied Vacation leave from 18th ,Mon 2017 to 26 sept,Tue 2017--7 days excluding sat,sun 

然后,我需要一个表中的

| leave type|count| 
| vacation | 7 | 
| casual | 2 | 
| sick  | 5 | 

这是一个员工的形式.​​.....我需要它甚至对每一位员工

models.py

class employees(models.Model): 
    emp_name = models.CharField(max_length = 100) 
    emp_loc = models.CharField(max_length = 100) 
    manager_id=models.IntegerField(null=True) 

class leave(models.Model): 
    employee = models.ForeignKey(employees, on_delete=models.CASCADE, default='1') 
    start_date = models.DateField() 
    end_date = models.DateField() 
    l_type=models.CharField(max_length=1) 

回答

0

你可以试试这个

from django.db.models import Count 
    leave.objects.all().values('l_type').annotate(count=Count('l_type')). 
            order_by('l_type') 
+0

在这里,我得到了多少次地位是病态,在查询的假期,但不是在特定类型的假期的start_date和end_date之间的计数 – divya

+0

什么是问题? – Robert

0

我认为你可以做到这一点通过使这些变化:

class leaves(models.Model) 
    employee = models.ForeignKey(employees, on_delete=models.CASCADE, default='1') 
    start_date = models.DateField() 
    end_date = models.DateField() 
    duration = models.DurationField(null=True) 
    l_type = models.CharField(max_length=20) 

    def save(self, force_insert=False, force_update=False, using=None, 
     update_fields=None): 
     self.duration = (self.end_date - self.start_date) 
     return super(Leaves, self).save() 

保存()会自动计算时间时,该对象被创建。

我们得到特定类型的叶的天,说“假期”的总和:(总和(“字段名”))返回与相关的和值的字典

leave_length = leaves.objects.filter(l_type='vacation').aggregate(Sum('duration'))['duration__sum'].days 

汇总一键名fieldname__sum,在我们的例子duration__sum

为了排除平日是指这个问题的答案: Count number of days between dates, ignoring weekends

+0

在这里,我为每个特定类型的假期获得假期长度,但如何总结特定类型的叶子,正如我在示例中提到的那样。 – divya

+0

{{leave.leave_length}}显示时间,即使是 Eg.Sept。 2017年5月15日至2017年9月22日8天0:00:00如何排除时间0:00:00 – divya

+1

尝试{{leave.leave_length.days}} –