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. Код не тестировался на реальном проекте и может содержать ошибки