2016-06-01 14 views
1

den folgenden Code Gegeben:Warum Annotate doppelte Einträge erzeugt?

payments = Payment.objects.filter(
     customer=self.customer, 
     created_at__gte=kwargs['start_date'], 
     created_at__lte=kwargs['end_date'] 
    ).order_by('-date') 

balance = payments.values('currency').annotate(Sum('amount')) 

> print(balance) 
> [{'amount__sum': Decimal('0.00'), 'currency': 'USD'}, 
    {'amount__sum': Decimal('0.00'), 'currency': 'USD'}, 
    {'amount__sum': Decimal('9000.00'), 'currency': 'SEK'}, 
    {'amount__sum': Decimal('45000.00'), 'currency': 'EUR'}, 
    {'amount__sum': Decimal('11385.00'), 'currency': 'SEK'}] 

Liste der Zahlungen für diese Kunden:

> print(payments) 
> ('-1487.50', 'USD') 
('1487.50', 'USD') 
('-3663.72', 'USD') 
('3663.72', 'USD') 
('15000.00', 'EUR') 
('9000.00', 'SEK') 
('30000.00', 'EUR') 
('9865.00', 'SEK') 
('1520.00', 'SEK') 

Wenn ich Aggregat verwenden, erhalte ich die Summe, sondern für alle Währungen und das ist nicht das, was ich will. Ich muss in der Lage sein, in Währungen zu spalten.

{'amount__sum': Decimal('65385.00')} 

Ich versuche, die Zahlungen von Kunden Gruppierung und Summieren von Währungen zu extrahieren. Es passiert jedoch, dass einige der Werte nicht addiert werden, sondern dupliziert werden. Irgendwelche Ideen?

+0

Welche der Zahlungen des Benutzers sind in dem angegebenen Zeitraum? – schwobaseggl

+0

Ich habe die Liste der Zahlungen gedruckt, die in der Frage zusammengefasst werden sollten. Es sollte alle Zahlungen aus allen Währungen in diesem Datumsbereich enthalten. –

Antwort

2

Es ist die order_by, die dies verursacht. Die in order_by erwähnten Felder sind implizit Teil der Gruppe, die ansonsten als die in values gemäß der docs on aggregation and order_by genannten Felder definiert ist.

Sehen Sie, wenn

Payment.objects.filter(
     customer=self.customer, 
     created_at__gte=kwargs['start_date'], 
     created_at__lte=kwargs['end_date'] 
    ).values('currency').annotate(Sum('amount')) 

werden Sie nicht genau geben die Antwort, die Sie suchen.

auf Payment.Meta.ordering gesetzt Dies wird auch durch eine Standardreihenfolge verursacht werden. Wenn Sie das getan haben, müssen Sie die Bestellung explizit wie folgt abbrechen:

Payment.objects.filter(
     customer=self.customer, 
     created_at__gte=kwargs['start_date'], 
     created_at__lte=kwargs['end_date'] 
    ).order_by().values('currency').annotate(Sum('amount')) 
+0

Ich habe versucht zu entfernen, wie Sie sagten, aber nicht funktioniert. Ich hatte ein 'meta' Attribut, das die Reihenfolge festlegte. Ich musste meine Abfrage überschreiben, indem Sie eine leere '.order_by Einstellung()', wie sie in der Tat hier erwähnen: https://docs.djangoproject.com/es/1.9/topics/db/aggregation/#values ​​ Bearbeiten Sie Ihre Antwort und füge diese Möglichkeit hinzu. Ich werde als die richtige markieren. :-) –

+0

Awesome, Prost. –

Verwandte Themen