Django在Postgresql db_collation字段中搜索

kxeu7u2r  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(123)

我正在使用Django和DRF searchFilter,它允许我将字段添加到视图的'search_fields'中以允许在其中搜索。Django版本是3.2(可能会升级到4.2),DRF版本是3.12.2。最近我添加了一个CharField类型的新字段,其db_collation为case_insensitive。我需要该字段不区分大小写,我知道Postgres将停止支持CI字段,建议使用db_collation。它确实有效,直到我想支持在那个领域的搜索。在将该新字段添加到视图的“search_fields”并尝试搜索后,我得到了以下错误消息-

File ".../lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params) 
django.db.utils.NotSupportedError: nondeterministic collations are not supported for LIKE

字符串
有没有预先准备好的解决方案?我找不到任何,我觉得奇怪的是,Postgres强制使用db_collation,但不支持LIKE。
这是模型中的字段定义-

custom_field = models.CharField(db_collation="case_insensitive", db_index=True, max_length=100, null=True)


这是排序规则定义-

[
    CreateCollation(
        "case_insensitive",
        provider="icu",
        locale="und-u-ks-level2-kn-true",
        deterministic=False,
    ),
]

7d7tgy0s

7d7tgy0s1#

基于here的讨论,这在Django 4.2中已经修复。Django 3(确切地说是3.2.x)的一个解决方案是将Postgres SchemaEditor子类化以覆盖其_create_like_index_sql方法,并在DATABASE条目中使用调整后的后端。
如果Postgres DB上存在varchar_pattern_ops索引,则更改该字段可能不够,可能需要重新创建。
希望这对你有帮助!

j91ykkif

j91ykkif2#

您提到了包含LIKE的查询的问题。如果是,则may not be supported by PostgreSQL
此外,某些操作对于非确定性排序规则是不可能的,例如模式匹配操作。因此,它们只应在特别需要的情况下使用。

相关问题