使用peewee进行不区分大小写的排序
下面这个排序是区分大小写的:
MyModel.select().order_by(MyModel.name)
<class '__main__.MyModel'> SELECT t1."id", t1."name" FROM "mymodel" AS t1 ORDER BY t1."name" []
我该怎么加一个 NOCASE
让它不区分大小写呢?
或者有没有其他方法可以让它不区分大小写?
我在 文档 上找不到相关的信息。
1 个回答
6
你可以使用一个SQL函数(通过fn
助手)来把模型名称变成小写:
MyModel.select().order_by(fn.Lower(MyModel.name))
如果你使用的是SQLite,你还可以使用自定义排序规则:
@db.collation()
def collate_case_insensitive(s1, s2):
return cmp(s1.lower(), s2.lower())
通过SqliteExtDatabase()
子类提供的@db.collation()
装饰器,你可以注册一个自定义的排序函数,然后用它来排序:
MyModel.select().order_by(collate_case_insensitive.collation(MyModel.name))
当然,SQLite本身已经有一个内置的NOCASE
排序规则,在这里应该使用这个,但要使用它,你必须构建一个SQL()
对象来包含原始SQL:
MyModel.select().order_by(Clause(MyModel.name, SQL('collate NOCASE')))
这和SQLAlchemy中的不区分大小写的排序方式是一样的:SQLAlchemy不区分大小写的排序