Дата начала первой записи, дата окончания последней записи для контракта каждого пользователя и как применять фильтры - PullRequest
0 голосов
/ 21 января 2019

Я немного над головой здесь. У меня есть таблица с информацией о контрактах всех сотрудников. Сотрудник может иметь несколько контрактов в этой таблице, так как каждый раз, когда они получают повышение или продление срока действия, будет заключен новый контракт. Кроме того, существует вероятность того, что сотрудник уходит из компании на любой период времени, поэтому между контрактами могут быть разрывы.

Я пытаюсь достичь двух вещей:

  • Среднее время, в течение которого сотрудники остаются на каждой должности
  • Годы службы, поэтому продолжительность каждого контракта с работником в совокупности

    class Contract(models.Model):
    
        user = models.ForeignKey(User, on_delete = models.CASCADE)
        employment = models.ForeignKey(Employment, on_delete = models.CASCADE, null = True, blank = True)
        jobgrade = models.ForeignKey(Jobgrade, on_delete = models.CASCADE, null = True, blank = True)
        contract_start = models.DateField(null = True, blank = True)
        contract_end = models.DateField(null = True, blank = True)
    

1 Ответ

0 голосов
/ 21 января 2019

Вы можете использовать метод свойств в ваших Jobgrade и Employee классах моделей, таких как:

class Jobgrade(models.Model):
   ...

   @property
   def average_time(self):
      # gets average time of of a Jobgrade
      return self.contract_set.all().annotate(diff=F('contract_start')-F('contract_end')).aggregate(avg=Avg('diff'))['avg']


class Employee(models.Model):
    ...
    @property
    def get_length(self):
       # gets sum time of of a Employee
       return self.contract_set.all().annotate(diff=F('contract_start')-F('contract_end')).aggregate(sum=Sum('diff'))['sum']

Здесь я использую , комментируя разницу между двумя значениями, используя F выражение.Тогда я использовал агрегацию , чтобы получить сумму и среднее .

Теперь вы можете использовать эти значения в шаблоне как:

{% for employee in Employee.objects.all %}
     {{ employee.get_length }}
{% endfor %}


{% for job in Jobgrade.objects.all %}
     {{ job.average_time }}
{% endfor %}
...