En la siguiente configuración, me gustaría un QuerySet con una lista de proyectos, cada uno anotado con la suma de todas sus duraciones (como tasks_duration) y la suma de todas sus tareas ' duraciones de la subtarea (como subtasks_duration). Mis modelos (simplificado) se ven así:multiple annotate Sum terms yields inflated answer
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)
hago mis QuerySet así:
Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration'))
relacionados con el comportamiento se explica en Django annotate() multiple times causes wrong answers recibo una tasks_duration que es mucho mayor de lo que debería ser. Las cláusulas de anotaciones múltiples (Sum()) producen múltiples uniones internas izquierdas en el SQL resultante. Con solo un único término de anotación (Sum()) para tasks_duration, el resultado es correcto. Sin embargo, me gustaría tener tanto tasks_duration como subtasks_duration.
¿Cuál sería una forma adecuada de hacer esta consulta? Tengo una solución de trabajo que lo hace por proyecto, pero eso es inusualmente lento. También tengo algo similar que funciona con una llamada extra(), pero realmente me gustaría saber si lo que quiero es posible con Django puro.
¿Usted intentó 'tasks_duration = Sum ('task__duration', distinto = True), subtasks_duration = Sum ('task__subtask__duration', distinto = True)' como mencionado en la otra pregunta que vinculó? – jpic
Eso solo servirá para sumar valores de duración distintos, que no es lo que quiero. Por curiosidad lo intenté, todavía produce los mismos valores incorrectos. (las duraciones varían) –
¿Alguna vez encontró una solución para esto? Estoy tratando de anotar una suma y un conteo en un conjunto de preguntas, y la suma se sigue multiplicando ... – StephenTG