mehrfache Anmerkungen Sum-Ausdrücke ergeben überhöhte Antwort

8

Im folgenden Setup möchte ich ein QuerySet mit einer Liste von Projekten, die jeweils mit der Summe aller Task-Dauern (als tasks_duration) und der Summe aller Subtask-Dauern ihrer Tasks (als subtasks_duration) versehen sind. Meine Modelle (vereinfacht) sehen so aus:

%Vor%

Ich mache mein QuerySet wie folgt:

%Vor%

Bezieht sich auf das Verhalten in Django annotiert () mehrere Male verursacht falsche Antworten Ich bekomme eine tasks_duration, die viel höher ist als es sein sollte. Die multiplen Annotate (Sum ()) -Klauseln ergeben mehrere linke innere Joins im resultierenden SQL. Mit nur einem einzelnen Kommentar (Sum ()) für tasks_duration ist das Ergebnis korrekt. Allerdings hätte ich gerne tasks_duration und tubtasks_duration.

Was wäre ein geeigneter Weg, um diese Abfrage durchzuführen? Ich habe eine funktionierende Lösung, die es pro Projekt macht, aber das ist erwartungsgemäß unbrauchbar langsam. Ich habe auch etwas Ähnliches, das mit einem extra () Anruf arbeitet, aber ich würde wirklich gerne wissen, ob was ich will mit reinem Django möglich ist.

    
Charl Botha 24.08.2012, 11:39
quelle

2 Antworten

1

Ich bekomme diesen Fehler auch. Genau der gleiche Code. Es funktioniert, wenn ich die Aggregation getrennt mache, aber sobald ich versuche, beide Summen zur gleichen Zeit zu bekommen, bekommt einer von ihnen einen Faktor 2 höher und der andere einen Faktor 3.

Ich habe keine Ahnung, warum Django sich so verhält. Ich habe hier einen Fehlerbericht eingereicht: Ссылка Vielleicht interessiert es dich auch.

    
tBuLi 22.09.2012 10:04
quelle
1

Der Fehler wurde hier gemeldet, aber er ist noch nicht einmal in Django 1.11 gelöst. Das Problem bezieht sich auf das Verbinden zweier Tabellen in umgekehrten Beziehungen. Beachten Sie, dass distinct Parameter für Count, aber nicht für Sum gut funktioniert. So können Sie einen Trick verwenden und ein ORM wie folgt schreiben:

%Vor%     
Ahmad 21.08.2017 18:08
quelle