首页 > 解决方案 > Django - 检查arrayfield元素是否在字符串中

问题描述

所以我想编写一个查询来查找带有 ArrayField 的对象,其中 ArrayField 中的一个元素在另一个字符串中

例如一个书籍模型,包含名为 'Synonyms' 的 ArrayField,

Book1 Synonyms : ['very good','awesome']
Book2 Synonyms : ['good','okay']

所以我想做的是,我想做某种搜索,假设用户搜索“它非常好”,所以它会导致 Book1。

我试图将用户搜索字符串拆分为数组,并执行类似的循环

for x in user_string.split():
   Book.objects.filter(synonyms__icontains = x)

它有效,但是,如果同义词之一是“哈哈”,然后用户搜索字符串是“哈”,它仍然会返回该对象。

想要的是查询返回字符串中具有精确元素的对象。例如,如果用户搜索包含单词“good”,则返回 book2,但如果搜索包含单词“very good”,则返回 book1

标签: djangopostgresql

解决方案


如果您想使用诸如exact查找用法之类的内容进行搜索,则必须尝试使用contained_by​​查找。

如果所有用户字符串必须在每个同义词数组中(如AND逻辑运算):

qs = Book.objects.all()
for synonym in user_string.split():
    qs = qs.filter(synonyms__contained_by=[synonym])

如果任何用户字符串必须在每个同义词数组中(如OR逻辑操作):

qs = Book.objects.filter(synonyms__contained_by=user_string.split())

推荐阅读