Nella seguente configurazione, vorrei un QuerySet con un elenco di progetti, ciascuno annotato con la somma di tutte le durate delle attività (come tasks_duration) e la somma di tutte le sue attività ' sottotask durations (come subtasks_duration). I miei modelli (semplificato) simile a questa:annotazione multipla I termini di somma danno una risposta gonfiata
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)
Faccio il mio QuerySet in questo modo:
Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration'))
correlati al comportamento spiegato in Django annotate() multiple times causes wrong answers ho un tasks_duration che è molto più alto di quanto dovrebbe essere. Le clausole di annotazione multipla (Sum()) producono più join interni a sinistra nell'SQL risultante. Con un solo termine annotazione (Sum()) per tasks_duration, il risultato è corretto. Tuttavia, mi piacerebbe avere sia tasks_duration sia subtasks_duration.
Quale sarebbe un modo adeguato per eseguire questa query? Ho una soluzione funzionante che lo fa per progetto, ma è prevedibilmente lento. Ho anche qualcosa di simile a lavorare con una chiamata extra(), ma mi piacerebbe davvero sapere se ciò che voglio è possibile con Django puro.
Hai provato 'tasks_duration = Sum ('task__duration', distinta = True), subtasks_duration = Somma ('task__subtask__duration', distinta = True)' come menzionato nell'altra domanda che hai collegato? – jpic
Questo servirà solo per sommare valori di durata distinti, che non è quello che voglio. Per curiosità, l'ho provato, restituisce sempre gli stessi valori errati. (le durate variano) –
Hai mai trovato una soluzione per questo? Sto cercando di annotare una somma e un conteggio su un queryset, e la somma continua a moltiplicarsi ... – StephenTG