Я устанавливаю две модели: Timesheet и TimesheetEntry. TimesheetEntry будет встроенным и устанавливается в файле admin.py, а оттуда вы можете указать текущие часы для каждого проекта. Мой вопрос заключается в том, как сделать функцию и рассчитать total_hours, чтобы я мог визуализировать ее в своей пользовательской таблице в шаблоне Django?
class TimesheetEntry(TimeStampedModel):
hours = models.DecimalField(max_digits=4, decimal_places=2, default=0, verbose_name=_("Hours"))
timesheet = models.ForeignKey('timesheet.TimeSheet', verbose_name=_("Timesheet"),
related_name='timesheet_entries', on_delete=models.CASCADE)
project = models.ForeignKey('project.Project', verbose_name=_("Project"),
related_name='timesheet_entries', on_delete=models.PROTECT, null=True)
project_role = models.ForeignKey('project.ProjectRole', verbose_name=_("Project role"),
related_name='timesheet_entries', on_delete=models.PROTECT, null=True)
def __str__(self):
return f"{self.timesheet} - {self.project} - {self.project_role}"
def save(self, **kwargs):
self.timesheet.save()
super().save(**kwargs)
class Meta:
verbose_name = _("Timesheet entry")
verbose_name_plural = _("Timesheet entries")
class Timesheet(TimeStampedModel):
date = models.DateField(verbose_name=_("Date"), default=datetime.date.today, editable=True)
total_hours = models.DecimalField(max_digits=4, decimal_places=2, verbose_name=_("Total hours"), editable=False)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='timesheet')
def __str__(self):
return f"{self.user} - {date_format(self.date, 'DATE_FORMAT')}"
def recalculate(self):
self.total_hours = self.timesheet_entries.all().aggregate(total_hours=Sum('hours'))['total_hours'] or 0
def save(self, **kwargs):
self.recalculate()
super().save(**kwargs)
def projects(self):
from hr.project.models import Project
return Project.objects.filter(
pk__in=self.timesheet_entries.all().values_list('project_id', flat=True).distinct()
)
class Meta:
verbose_name = _("Timesheet")
verbose_name_plural = _("Timesheets")
```