我正在使用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,
),
]
型
2条答案
按热度按时间7d7tgy0s1#
基于here的讨论,这在Django 4.2中已经修复。Django 3(确切地说是3.2.x)的一个解决方案是将Postgres SchemaEditor子类化以覆盖其
_create_like_index_sql
方法,并在DATABASE条目中使用调整后的后端。如果Postgres DB上存在
varchar_pattern_ops
索引,则更改该字段可能不够,可能需要重新创建。希望这对你有帮助!
j91ykkif2#
您提到了包含
LIKE
的查询的问题。如果是,则may not be supported by PostgreSQL:此外,某些操作对于非确定性排序规则是不可能的,例如模式匹配操作。因此,它们只应在特别需要的情况下使用。