我正在尝试在我的应用中创建搜索字段。首先,我想加载所有结果,但如果用户请求搜索,只显示您的答案。
def get_queryset(self):
pista = self.request.GET.get('pesquisar_por')
sql = (
"SELECT t1.codigo, t1.nome, t1.quantidade, t1.preco_venda, t2.nome as nome_grupo "+
"FROM produto t1 "+
"LEFT JOIN grupo t2 on (t1.grupo = t2.codigo) "+
"WHERE t1.status= 'A' ")
if pista is not None:
sql = sql + ("AND t1.nome LIKE %s", ['%'+pista+'%'])
sql = sql + "ORDER BY t1.nome LIMIT 300"
produtos = Produto.objects.using('horus').raw(sql)
return produtos
但是这显示了这个错误:无法将'tuple'对象隐式转换为str 。
错误在这一行:sql = sql +(“AND t1.nome LIKE%s”,['%'+ pista +'%'])
答案 0 :(得分:1)
我相信你的sql连接和执行应该是这样的:
sql = sql + "AND t1.nome LIKE %%s%"
然后在.raw()
方法中传递参数,如:
produtos = Produto.objects.using('horus').raw(sql, [pista])
我不记得你是否需要使用%
而不是%%%s%%
逃避 %%s%
,但你绝对应该使用方法签名而不是自己连接事物以避免SQL注入攻击。
选中此项作为参考:https://docs.djangoproject.com/en/1.8/topics/db/sql/#passing-parameters-into-raw
P.S。您可能有理由使用原始sql而不是ORM,但我建议首先用尽可能使用ORM而不是原始sql的方法。不过,这取决于你。
答案 1 :(得分:0)
你可以试试这个:
if pista is not None:
sql = sql + "AND t1.nome LIKE %{pista}%".format(pista=pista)
这个不会在str 中转换元组,但可以提供帮助。