user11766958
user11766958

Reputation: 419

Sum up the amount of leave taken

I have a model which have one to many relationships, for instance, a user can apply for one or many leaves. I want to add up the number of leaves for each user and then group by the user but I am not sure how to do that. I did something as below but it doesn't seem to work.

def monthly_leave_taken(request):
    result = NewLeave.objects.values('user').annotate(Sum('Total_working_days'))
    return render(request, "result.html", locals())

class NewLeave(models.Model):
    user = models.ForeignKey(User, default='', on_delete=models.CASCADE)
    leave_balances = models.ManyToManyField(Leave_Balance)
    leave = (
        ('annual', 'annual'),
        ('sick', 'sick'),

    )

    Leave_type = models.CharField(max_length=100, choices=leave, blank=False, default='')

    Start_Date = models.DateField(null=True, blank=False)
    End_Date = models.DateField(null=True, blank=False)
    Total_working_days = models.FloatField(null=True, blank=False)
    Reason = models.TextField(max_length=1000, null=True, blank=False)
    Aut = (
        ('Pending', 'Pending'),
        ('Approved', 'Approved'),
        ('Rejected', 'Rejected'),
    )
    Manager_Authorization_Status = models.CharField(max_length=100, choices=Aut, default='Pending', blank=False)
    Authorized_by_Manager = models.CharField(max_length=100, default='', blank=False)
    Authorised_Date = models.DateField(null=True, blank=False)
    DirAuth = (
        ('Pending', 'Pending'),
        ('Approved', 'Approved'),
        ('Rejected', 'Rejected'),
    )

    Director_Authorization_Status = models.CharField(max_length=100, choices=DirAuth, default='Pending', blank=False)
    Authorized_by_Director = models.CharField(max_length=100, default='', blank=False)
    Date_Authorized = models.DateField(null=True, blank=False)
    arc = (
        ('', ''),
        ('Archived', 'Archived'),

    )
    Archived = models.CharField(max_length=100, choices=arc, default='', blank=False)

    def __str__(self):
        return self.Leave_type

Upvotes: 0

Views: 63

Answers (1)

ac2001
ac2001

Reputation: 736

If you need the users first_name, then it might make sense to run the query on the User model.

users = User.objects.annotate(new_leave_tot_w_days=Sum('newleave__total_working_days'))

In the template you can loop over the users and and access the "new_leave_tot_w_days" attribute.

{%for user in users %} <td>{{user.first_name}}</td> <td>{{user.new_leave_tot_w_days}}</td> {%endfor%}

Upvotes: 1

Related Questions