如何在 Django 框架中使用 pg_trgm 运算符(例如 %>)?

How to use pg_trgm operators(e.g. %>) in django framework?

我在 PostgreSQL 数据库上使用 pg_trgm 进行相似性搜索,我需要使用 Django 模型 return 将结果放在前面。但是,我遇到了 Django 框架无法识别运算符 %> 的问题。

有什么建议吗?

谢谢。

我使用model.objects.raw()执行SQL。我收到错误响应:

unsupported format character '>' (0x3e) at index 52
searchParam ='test'
mymodel.objects.raw('select * from mytable where columnname %> %s', [searchParam])
ValueError: response:unsupported format character '>' (0x3e) at index 52

尝试用转义后的 %% 符号替换 %> 项。这应该导致以下简单的 SQL 查询:

'select * from mytable where columnname = %%%s%%'

我相信这个查询应该足以满足您的目的。

看来您的问题实际上与 Python 的字符串替换有关。为了构建最终的查询字符串,Django 会做类似的事情:

self.sql % self.params

这使用旧式 %-格式,它想将您的 %> 解释为字符串替换机制,类似于 %s,但这不是有效的组合。要在格式化字符串中创建一个 % 字符,您只需在输入字符串中使用 %%,如下所示:

In [1]: MyModel.objects.raw('SELECT * FROM myapp_mymodel WHERE myfield %%> %s', ['test'])
Out[1]: <RawQuerySet: SELECT * FROM myapp_mymodel WHERE myfield %> test>

...

顺便说一下,Django 在 pg_trgm 的基本用法上有 documentation,而无需求助于原始查询字符串。只需确保您有一个首先激活扩展的迁移:

In addition to the trigram_similar lookup, you can use a couple of other expressions.

To use them, you need to activate the pg_trgm extension on PostgreSQL. You can install it using the TrigramExtension migration operation.