Django filter queryset для каждого элемента

Я не могу сам придумать хорошую логику, поэтому надеюсь, что кто-нибудь сможет мне помочь.

Цель заключается в следующем:

У меня есть дата, которую может ввести пользователь, дата от_даты, час_прогноза, дата до_даты и час по умолчанию.

Мне нужно отфильтровать из набора сотрудников каждого работодателя, у которого есть дата from_date с его prognosis_hour в диапазоне даты, которую вводит пользователь, чтобы просуммировать его с другими часами сотрудников, извращение в том, что когда есть сотрудники без даты from_date с prognosis_hours, то должен использоваться default_hour.

Теперь у меня есть это

    @property
    def prognosis(self):
        mylist = []
        for e in self.employee_set.exclude(prognosis_hours__isnull=True, from_date__isnull=True):
            for i in self.employee_set.filter(from_date__gte=self.entered_date, to_date__lte=self.entered_date):
                e.default_hours 
                mylist.append(i.prognosis_hours)
                mylist.append(e.default_hours)
                return mylist 

прямо сейчас он фильтрует всех в пределах введенной даты и добавляет их в список, показывая часы по умолчанию и прогнозу, но игнорирует всех остальных с часами по умолчанию

В конце концов, он должен просто суммировать все часы по умолчанию и часы прогноза вместе, когда часы прогноза находятся в диапазоне даты сегодня или даты, введенной пользователем

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

class work(models.Model):
      entered_date = DateField()


    @property
    def prognosis(self):
        mylist = []
        for e in self.employee_set.exclude(prognosis_hours__isnull=True, from_date__isnull=True):
            for i in self.employee_set.filter(from_date__gte=self.entered_date, to_date__lte=self.entered_date):
                e.default_hours 
                mylist.append(i.prognosis_hours)
                mylist.append(e.default_hours)
                return mylist 

class employee(models.Model:
     work_fk = models.ForeignKey(work, null=True, on_delete=models.SET_NULL)
     default_hours = models.IntegerField(default=0)
     from_date = models.DateField(null=True, blank=True)
     prognosis_hours = models.IntegerField(default=0)
     to_date = models.DateField(null=True, blank=True)

Я не уверен в вашей логике, но я могу представить, что вы хотите:

@property
def prognosis(self):
    query = Q(from_date__gte=self.entered_date) | Q(from_date__isnull=True)
    query &= Q(to_date__lte=self.entered_date) | Q(to_date__isnull=True)

    queryset = self.employee_set.annotate(prognosis_hours=Coalesce('prognosis_hours', default_hours).filter(query)
    return queryset.aggregate(Sum('prognosis_hours'))

эта obj.prognosis должна возвращать сумму всех prognosis_hours в фильтрованном наборе сотрудников.

Больше здесь: https://docs.djangoproject.com/en/4.1/ref/models/database-functions/

p.s. Код не тестировался на реальном проекте и может содержать ошибки

Вернуться на верх