2011-01-04 2 views
4

У меня есть объект с десятичным значением поля 5.60. Я делаю запрос:Запрос Django на десятичное поле

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

Это вернет правильный результат. Но это не будет:

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

Есть ли способ автоматически согласовать эту несогласованность? Значение фильтра предоставляется пользователю, поэтому я хочу быть уверенным, что пользователь, набравший 5.6, может найти объект.

+0

Почему вы используете 'iexact' для десятичных знаков в первую очередь? – AndiDog

+1

, потому что я не знаю ответа на этот вопрос. :) Что я должен использовать вместо этого? –

ответ

8

iexact делает проверку равенства между регистром, которая обычно используется для строк. Для десятичных знаков с двумя знаками после запятой бэкэнд базы данных Django, вероятно, сохранит «5.60» в качестве строки для DecimalField, поэтому сравнение ieactact с этим будет работать, потому что строки равны. Но, как вы хотите сравнить номера, а не строки, вы должны просто использовать обычный оператор равенства.

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

Не использовать строки, вместо того, чтобы использовать Python встроенная_команда_оболочки Decimal типа. При извлечении экземпляров модели с помощью Django вы все равно получите экземпляры этого типа, поэтому вы также должны назначить этот тип, чтобы быть последовательным.

+0

Хотя без 'iexact', строковый параметр будет работать нормально:' Mdl.objects.get (speed = "5.6") ' –

+0

Правильно, для' DecimalField' строки и экземпляры 'Decimal' не делают разница. – AndiDog