也许(快速)解决这个问题的最好方法是更新DecimalField
文档以表明不支持order_by
。
从长远来看,一个警告LEVE日志消息可能是当输出order_by
试图在操作DecimalField
。 出于性能原因,字段类型的验证只能在站点处于DEBUG
模式时进行。
对此的一种解决方法是将十进制字段的内容存储为整数。 例如,如果我有一个名为 MyModel 的模型,其中有一个名为 price 的 Decimal 字段,我可以将它乘以小数位数并存储为整数。
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 不起作用”,那么我认为我们应该弃用字段类型或在字段类型列表中明确警告,因为它很容易使用错误,如果你有一个大数据库,修复速度会很慢。
也不适用于弹性搜索
:+1:
@JoeJasinski 非常感谢你,你的回答帮助了我
对此的一种解决方法是将十进制字段的内容存储为整数。 例如,如果我有一个名为 MyModel 的模型,其中有一个名为 price 的 Decimal 字段,我可以将它乘以小数位数并存储为整数。
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')
? 对?
最有用的评论
对此的一种解决方法是将十进制字段的内容存储为整数。 例如,如果我有一个名为 MyModel 的模型,其中有一个名为 price 的 Decimal 字段,我可以将它乘以小数位数并存储为整数。