Reputation: 419
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
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