在Django中,如何找到一个字符串的一部分,而不是包含该字符串?

时间:2013-11-05 15:26:52

标签: python mysql sql database django

例如,我的表中的两个字段下面有三行,如下所示

id name
-------
1  brown cat
2  black dog
3  person

这里有一个字符串或一个句子:A brown cat jumps over a person,如何使用这个字符串来获取第一行和第三行,这是这句话的一部分?据我了解,__contains__regex只能搜索包含目标字符串的字词,但如果该字词是目标字符串的一部分则无效。有没有人对此有想法?

3 个答案:

答案 0 :(得分:2)

你可以这样做:

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())))

答案 1 :(得分:2)

以下查询将执行:

>>> 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'}]

答案 2 :(得分:1)

我不认为Django ORM可以实现这一点,但它绝对可以用于原始SQL。这是一个有效的查询:

SELECT id
FROM table
WHERE 'A brown cat jumps over a person'
      LIKE '%' || name || '%'

诀窍是使用该列作为搜索短语。这应该是合理的数据库独立性。您可以使用QuerySet的extra method将原始SQL的使用限制在最低限度。