例如,我的表中的两个字段下有三行,如下所示
id name
-------
1 brown cat
2 black dog
3 person
这里来了一个字符串,或者一个句子:A brown cat jumps over a person
,我如何使用这个字符串来获取第一行和第三行,这是这句话的一部分?据我了解,__contains
并且__regex
只能搜索包含目标字符串的术语,但如果该术语是目标字符串的一部分,则将不起作用。有没有人对此有想法?
你可以这样做:
import operator
from django.db.models import Q
sentence = 'A brown cat jumps over a person'
queryset = MyModel.objects.filter(reduce(operator.or_, (Q(myfield__icontains=word) for word in sentence.split())))
以下查询将执行:
>>> sentence = 'A brown cat jumps over a person'
>>> MyModel.objects.extra(where={"%s like CONCAT('%%', `name` ,'%%')"},
... params=[sentence]).values()
[{'id': 1L, 'name': u'brown cat'}, {'id': 3L, 'name': u'person'}]
我认为这对于 Django ORM 是不可能的,但对于原始 SQL 绝对是可行的。这是一个有效的查询:
SELECT id
FROM table
WHERE 'A brown cat jumps over a person'
LIKE '%' || name || '%'
诀窍是使用该列作为搜索短语。这应该合理地独立于数据库。您可以使用 QuerySet 的额外方法将原始 SQL 的使用限制在最低限度。