MawaLog

一日一日を大切に、楽しく生きる。技術と音楽が好き。

DjangoORM:Decimal fieldはDecimal型でフィルターをかけないと死にかけます

症状

diciをDecimal Fieldのモデルフィールド(モデル名はSomething)として、

Something.objects.all().filter(dici=1.123) 
あるいは、
Something.objects.all().filter(dici=float("1.123")) 

とフィルターをかけるとする。Decimal Fieldに、1.123とDecimal fieldで定義した桁数内の小数ならフィルターできるんじゃないのと思っていた。実際$python manage.py runserver ではうまく機能していることを確認(これがひっかけで小数なら結構ガバガバにフィルターかけれるんだ楽〜という先入観を持ってしまった・・・)。

だがしかし・・・

本番環境では許してもらえなかった。クエリが見つからないとエラーがドンドン出てくる・・・orz

Something.objects.get(id=1) 

とかidで絞るとクエリは引っかかるので、モデル自体は読み込めてることも分かる・・・

解決策

Decimal型は、フィルターを確実にかけるにはDecimal型に直さないとだめ。

from decimal import Decimal #インポート必要!

Something.objects.all().filter(dici=Decimal("1.123")) 

これでフィルターかけられます。

参考にさせていただいた記事

jutememo.blogspot.jp