2011-01-04 8 views
4

Ich habe ein Objekt mit einem DecimalField-Wert von 5,60. Ich mache eine Abfrage:Django Abfrage auf Dezimalfeld

Mdl.objects.get(speed__iexact="5.60") 

Dies wird das richtige Ergebnis zurückgeben. Aber das wird nicht:

Mdl.objects.get(speed__iexact="5.6") 

Gibt es eine Möglichkeit, diese Inkonsistenz automatisch in Einklang zu bringen? Der Filterwert wird vom Benutzer bereitgestellt, daher möchte ich sicher sein, dass ein Benutzer, der 5.6 verwendet, das Objekt finden kann.

+0

Warum verwenden Sie "iexact" für Dezimalstellen an erster Stelle? – AndiDog

+1

weil ich die Antwort auf diese Frage nicht kenne. :) Was soll ich stattdessen verwenden? –

Antwort

8

iexact prüft die Groß-/Kleinschreibung, die normalerweise für Strings verwendet wird. Für Dezimalstellen mit zwei Dezimalstellen speichert das Django-Datenbank-Backend wahrscheinlich "5.60" als Zeichenkette für eine DecimalField, so dass der ixact-Vergleich damit funktioniert, weil die Zeichenketten gleich sind. Aber wie Sie Zahlen, keine Zeichenfolgen vergleichen möchten, sollten Sie nur den normalen Gleichheitsoperator verwenden.

from decimal import Decimal 
Mdl.objects.get(speed=Decimal("5.6")) 

keine Strings Verwenden Sie stattdessen die Python-builtin Decimal Typ verwenden. Beim Abrufen von Modellinstanzen mit Django erhalten Sie trotzdem Instanzen dieses Typs. Daher sollten Sie diesen Typ auch zuweisen, um konsistent zu sein.

+0

Obwohl ohne den 'iexact', ein String-Parameter wird gut funktionieren:' Mdl.objects.get (Geschwindigkeit = "5.6") ' –

+0

Richtig, für ein' DecimalField' machen Strings und Instanzen von 'Dezimal' keine a Unterschied. – AndiDog