使用peewee进行不区分大小写的排序

3 投票
1 回答
2439 浏览
提问于 2025-04-18 07:05

下面这个排序是区分大小写的:

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不区分大小写的排序

撰写回答