Django:查询根据类型查找总数

时间:2017-09-14 18:35:50

标签: django

我有每个人应用的员工和叶子类型,如休闲,病假,假期,产假,陪产...我想要一张每个员工的餐桌,其中包含在不同的leave_types中批准的叶子数量,不包括当年的sat,sun 2017

 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)

2 个答案:

答案 0 :(得分:0)

你可以试试吗

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

答案 1 :(得分: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()

save()将在创建对象时自动计算持续时间。

现在要获得特定类型的叶子的总天数,请说“假期”:

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

聚合(Sum(' fieldname'))返回一个dict,其中包含与键名 fieldname__sum 关联的总和值,在我们的示例中 duration__sum

要排除工作日,请参阅此问题的答案: Count number of days between dates, ignoring weekends