0

と を使用する単純なオブジェクト フィルターがprice__ltありprice__gtます。これは、価格と呼ばれる私の製品モデルのプロパティで機能します。これはCharField[文字列] です (10 進数でも同じエラーが発生し、集計で問題が発生したため、文字列に戻りました)。

これらの値をフィルターに渡すと、奇妙な方法で処理されるようです。たとえば、10 は 100 として処理されます。たとえば、次のようになります。

/products/price/10-200/ 100 ~ 200 の価格の商品を返品します。フィルターは filterargs: として渡されます FILTER ARGS: {'price__lt': '200', 'price__gt': '10'}。これは、price/0-170 が 18.50 の価格の製品を返さないという意味でも壊れています。何らかの理由で 170 を「18 未満」として扱っています。

これを引き起こす原因と、それを修正する方法はありますか? ありがとう!

4

1 に答える 1

2

Jeff が示唆するように、問題は price が でありCharField、したがって文字ごとの文字列比較ロジックを使用して比較されていることです。つまり、 で始まる任意の長さの文字列は、1で始まる任意の長さの文字列よりも小さくなります2

price を にすることでどのような問題が発生したか知りIntegerFieldたいのですが、それは簡単な解決策のように思えますが、 price を として保持する必要がある場合はCharField、クエリを機能させる (ハッキーな) 方法を次に示します。

lt = 200
gt = 10
qs = Product.objects.extra(select={'int_price': 'cast(price as int)'},
                           where=['int_price < %s', 'int_price > %s'],
                           params=[lt, gt])
qs.all()  # the result

これは、 Django の QuerySet クラスのメソッドを使用します。これについては、こちらextraのドキュメントで読むことができます。簡単に言えば、SQL の式を使用して文字列価格の整数バージョンを計算し、それに基づいて整数でフィルター処理します。cast

于 2012-08-07T13:20:13.240 に答える