django-haystack在order_by函数中按字母顺序排序

时间:2012-07-10 11:49:52

标签: django django-models solr sql-order-by django-haystack

我在django-haystack>中订购时遇到一些问题。<

情况是: 我有产品型号, 产品型号具有company_name属性,此属性也包含在solr-haystack中。

product_1.company name = "Cba ltd"
product_2.company_name = "Abc ltd"
product_3.company_name = "bac ltd"
product_4.company_name = "aac ltd"

sqs = SearchQuerySet().models(Product).order_by("company_name")

当我按公司名称搜索和订购时,结果是[product_2,product_1,product_4,product_3]

系统首先按大写结尾排序大写,然后继续小写。

如何在不检查大写或小写的情况下将其设为字母? 结果应该是[product_4,product_2,product_3,product_1]

谢谢你在这种情况下帮助我。

欢呼声,

2 个答案:

答案 0 :(得分:3)

您可以使用extra并将'company_name'传递给lower()

这看起来像是:

sqs = SearchQuerySet().models(Product).order_by("company_name").extra(select={'company_name': 'lower(company_name)'}).order_by('company_name')

希望这有帮助!

答案 1 :(得分:0)

通过多值字段排序是没有意义的,并且分析的字符串是多值字段。

因此,使用与排序相同的数据创建一个未分析的字段:

class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    company_name = indexes.EdgeNgramField(model_attr='company_name')
    company_name_raw = indexes.CharField(model_attr='company_name', indexed=False)

sqs = SearchQuerySet().models(Product).order_by('company_name_raw')

有关详细信息,请参阅documentation