django查询多个表 - 将参数传递给查询

时间:2015-02-10 15:43:55

标签: python django django-1.7

我正在使用Django 1.7。

我正在尝试实现搜索功能。当输入搜索词时,我需要在DB中搜索该术语的所有表和所有列(我只有7个表,总共可能有40个列,而且DB不是很大)。我使用MySQL作为数据库。

我可以使用以下代码查询1个表,所有列

 query = Q(term__contains=tt) | Q(portal__contains=tt) | ......so on
 data = ABC.objects.filter(query)

我尝试使用UNION,编写类似

的SQL
select * from table A where col1 like %s OR col2 like %s .....
 UNION
 select * from table B where col1 like %s OR col2 like %s .....

当我尝试如下所示实现此功能时,我收到错误“格式字符串的参数不足

cursor = connection.cursor()
cursor.execute("select * from table A where col1 like %s OR col2 like %s 
     UNION
     select * from table B where col1 like %s OR col2 like %s", tt)

那么如何传递多个变量的参数(即使在这种情况下它们是相同的)?我也试过多次传递它。

感谢。

1 个答案:

答案 0 :(得分:1)

您应该传递参数列表。参数数量应与%s占位符的数量匹配:

cursor.execute("select * from table A where col1 like %s OR col2 like %s 
                UNION
                select * from table B where col1 like %s OR col2 like %s",
                [tt] * 4) # four `%s`

作为替代方案,您可以尝试使用numeric paramstyle进行查询。在这种情况下,单个参数的列表就足够了:

cursor.execute("select * from table A where col1 like :1 OR col2 like :1 
                UNION
                select * from table B where col1 like :1 OR col2 like :1",
                [tt])

更新:请注意,tt变量在开头/结尾应包含%个符号:

tt = u'%' + string_to_find + u'%'

UPDATE 2 cursor.fetchall()返回元组列表(不是dicts),因此您应该通过索引访问此数据:

{% for row in data %}
    <div>Col1: {{ row.0 }} - Col2: {{ row.1 }}</div>
{% endfor %}