2012-01-12 19 views
0

我在开发服务器上使用icontains得到一些奇怪的行为。我有一个复杂的查询,它已经返回了一些奇怪的结果(不是预期的数字)。我钻了下去发现问题似乎与icontainsDjango在开发中的奇怪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的外壳和运行:

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

我得到一个单一的结果:

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

在猜测我会说这是关于空格的数量在en_name串(河乌龟有一个,而其他人有> 1)。我也听说icontains在开发和生产中可以有不同的表现。

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

+0

运行它,看到的是实际上正在创建哪些SQL:>>>怎么一回事,因为上面是打印query_set.query – Ted 2012-01-12 23:49:09

+0

只是一个例子,如果我运行print query_set.query,那么我在我的真实数据集上得到一堆连接。导入部分虽然提出了...... WHERE mytable'.en_name' LIKE%tortoise%'。它不应该是RLIKE吗? – 2012-01-13 00:02:02

+0

不知道如何获得LIKE而不是ILIKE,但请参阅我的答案以了解如何获得您正在查找的RLIKE行为 – Ted 2012-01-13 05:47:30

回答