Wielokrotne sumy adnotacji dają zawyżoną odpowiedź

W poniższej konfiguracji chciałbym, aby QuerySet zawierał listę projektów, z których każdy był opatrzony sumą wszystkich czasów trwania zadania (jako task_duration) i sumą wszystkich czasów trwania podzadania jego zadań (jako czas trwania podzadania). Moje modele (uproszczone) wyglądają tak:

class Project(models.Model):
    pass

class Task(models.Model):
    project = models.ForeignKey(Project)
    duration = models.IntegerField(blank=True, null=True)

class SubTask(models.Model):
    task = models.ForeignKey(Task)
    duration = models.IntegerField(blank=True, null=True)

Tworzę mój QuerySet w ten sposób:

Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration'))

Związane z zachowaniem wyjaśnionym wDjango annotate () wielokrotnie powoduje błędne odpowiedzi Dostaję czas trwania zadania o wiele wyższy niż powinien. Klauzule wielokrotnych adnotacji (Sum ()) dają wielokrotne wewnętrzne połączenia w wynikowym SQL. Przy tylko jednym opisie (Sum ()) termin na task_duration wynik jest poprawny. Chciałbym jednak mieć zarówno task_duration, jak i subtasks_duration.

Jaki byłby odpowiedni sposób wykonania tego zapytania? Mam działające rozwiązanie, które robi to na każdy projekt, ale to jest prawdopodobnie wyjątkowo wolne. Mam też coś podobnego do pracy z wywołaniem extra (), ale naprawdę chciałbym wiedzieć, czy to, czego chcę, jest możliwe z czystym Django.

questionAnswers(2)

yourAnswerToTheQuestion