おそらく、これに(迅速に)対処する最善の方法は、 DecimalField
ドキュメントを更新して、 order_by
がサポートされていないことを示すことです。
長期的には、 DecimalField
order_by
操作が試行されると、警告レベルのログメッセージが出力される可能性があります。 パフォーマンス上の理由から、フィールドタイプの検証は、サイトがDEBUG
モードの場合にのみ実行できました。
この回避策の1つは、10進フィールドの内容を整数として格納することです。 たとえば、priceというDecimalフィールドを持つMyModelというモデルがある場合、それを小数点以下の桁数で乗算して整数として格納できます。
class MyIndex(SearchIndex):
...
price = IntegerField(model_attr='price')
def prepare_price(self, obj):
return int(obj.price * Decimal('100'))
これはelasticsearchでは機能するようですが、solrでは機能しません。
このバグはWhooshにも当てはまるようです。
範囲クエリもelasticsearchで失敗します。
+1
SolrBackendを使用してこれと同じ問題が発生しました。 複雑なスコアリングアルゴリズムを表す0.0〜1.0の数値を含むフィールドで並べ替えています。 文字列で並べ替える場合、スコアが非常に小さい要素は、スコアが大きい要素よりも上に並べ替えられます(例:9e-08)。
かなり、明らかな回避策は、代わりにフロートフィールドを使用することです(私の目的には実際には関係ありません)。
これはかなり悪いです。 修正されないが、「order_byが機能しない」と記載されている場合は、フィールドタイプを非推奨にするか、フィールドタイプのリストに明確な警告を表示する必要があると思います。大規模なデータベースがある場合は、間違いがあり、修復に時間がかかります。
Elasticsearchでも機能しません
:+1:
@JoeJasinskiどうもありがとうございました、あなたの答えは私を助けました
この回避策の1つは、10進フィールドの内容を整数として格納することです。 たとえば、priceというDecimalフィールドを持つMyModelというモデルがある場合、それを小数点以下の桁数で乗算して整数として格納できます。
class MyIndex(SearchIndex): ... price = IntegerField(model_attr='price') def prepare_price(self, obj): return int(obj.price * Decimal('100'))
その後?
MyIndex.objects.all().order_by('prepare_price')
? 右?
最も参考になるコメント
この回避策の1つは、10進フィールドの内容を整数として格納することです。 たとえば、priceというDecimalフィールドを持つMyModelというモデルがある場合、それを小数点以下の桁数で乗算して整数として格納できます。