Django奇怪的icontains在开发中的行为

时间:2012-01-12 22:23:00

标签: django django-queryset

我在开发服务器上使用icontains得到了一些奇怪的行为。我有一个复杂的查询,它返回了一些奇怪的结果(不是预期的数字)。我深入研究,发现问题似乎与icontains有关。

首先,这是我想在Django中运行的部分查询的mysql输出:

mysql> select * from species where en_name RLIKE 'tortoise';
+-------+----------------------------------+
| id    | en_name                          |
+-------+----------------------------------+
| 16215 | Santa Cruz Galapagos Tortoise    |
| 16214 | Floreana Galapagos Tortoise      |
| 16213 | Volcan Darwin Galapagos Tortoise |
| 16211 | Sierra Negra Galapagos Tortoise  |
| 16210 | Pinzon Galapagos Tortoise        |
| 16209 | Santiago Galapagos Tortoise      |
|   738 | River Tortoise                   |
| 16207 | Volcan Wolf Galapagos Tortoise   |
| 16206 | Pinta Galapagos Tortoise         |
| 16216 | Fernandina Galapagos Tortoise    |
| 16217 | Santa Fe Galapagos Tortoise      |
| 16218 | Alcedo Galapagos Tortoise        |
| 16219 | Cerro Azul Galapagos Tortoise    |
| 16220 | Rabida Galapagos Tortoise        |
+-------+----------------------------------+
14 rows in set (0.00 sec)

当我进入Django shell并运行:

query_set = Species.objects.filter(en_name__icontains='tortoise')

我得到一个结果:

>>> for i in query_set:
...     print i.en_name   
...     
River Tortoise 

猜测我会说它与en_name字符串中的空格数有关(River Tortoise有一个,而其他有> 1)。我也听说icontains在开发和生产方面表现不同。

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

如果你想做RLIKE,我的理解是REGEXP的别名http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

query_set = Species.objects.filter(en_name__regex='tortoise')