cb
、66.45という名前のGETパラメータを解析し、floatに変換して66.45を得ました。djangoは間違った数字を使ってデータを照会します
cb = request.GET.get("cb", '')
if re.match('^\d+(\.\d+)?$', cb):
cb=float(cb)
params['cb'] = cb
次に、dbデータのクエリに使用しました。空の状態です。実際に
products = Product.objects.filter(**params)
、私はデバッグ時に、クエリのSQLは66.4500000000000028421709430404007434844970703125
代わりの66.45
を使用し、それは私の空のクエリ結果を引き起こしました。
cb
は、以下のように製品モデルで定義されています
cb = models.DecimalField(max_digits=6, decimal_places=2, default=0)
は何も悪いことはありますか?私は混乱しています。
フロートは正確なタイプではありません。したがって、クエリを実行する前にcbを66.45に調整する必要があります。 – Guinner
浮動小数点型変換を行わずに 'cb'を使ってみましたか?つまり、文字列として使用しましたか? –
これは、mysqlがサポートしているため、cbが文字列として使用されているときに機能します。 私は、Pythonインタプリタでfloatにcbをキャストしようとしましたが、同じ66.45を持っています。なぜdjangoクエリーで使用すると正確ではないのですか?そして、数字を投げるのはとても危険ですか? – Uphie