2016-04-09 12 views
0

I ein Django 1.9 queryset qs haben, auf die ich die folgenden Anmerkungen hinzufügen:Django Anmerkungen versehen F()/F() "Runden" unerwartet

qs = qs.annotate(total_messages= 
    Sum(Case(..., output_field=FloatField())) 

qs = qs.annotate(spam_messages= 
    Sum(Case(..., output_field=FloatField())) 

qs = qs.annotate(spam_rate=F('spam_messages')/F('total_messages')) 

Weirdly, scheinen die Ergebnisse nach unten gerundet werden (wie Math .floor), so dass ich die folgenden Ergebnisse (Beispiele) erhalten:

total_messages = 40.0, spam_messages = 24.0, spam_rate = 0.0 
total_messages = 10.0, spam_messages = 10.0, spam_rate = 1.0 

auch könnte es sein, dieses Verhalten nur aufgetreten, nachdem sie von Django 1.7 Upgrade 1.9 Django.

Mache ich etwas falsch oder ist das ein Fehler?

Vielen Dank im Voraus!

+1

Könntest du die ... in deinen 'Case'-Ausdrücken ausdrücken? – lac

Antwort

0

Ok, fand das Problem dank lac Kommentar:

Im Gehäuse (...) Ich habe Aussagen wie folgt aus:

When(
    message__date__gte=one_month_ago, 
    then=1 
    ) 

Wenn ich die 1-1,0 aller Arbeit ändern wie erwartet .

Noch sieht dies wie ein Fehler für mich aus, vor allem da ich output_field = FloatField() angeben, aber selbst mit IntegerFields glaube ich, dass die Division eine Dezimalzahl zurückgeben sollte, nicht wahr?