Django:使用cursor.execute()格式化模板的原始查询

时间:2013-01-10 18:10:22

标签: python django django-templates

我需要执行原始查询:

 cursor.execute("select id, name from people")
 results = cursor.fetchall()

如何转换它以便我可以在Django模板中使用它:

{% for person in results %}
  {{person.name}}
{% endfor %}

通常情况下,我会使用该模型:

results = people.objects.raw("select id, name from people")

无论我在查询中使用了多少其他模型/表,它都能正常工作。

但是,该方法要求我包含人员模型的主要ID。我这次不能这样做,因为sql实际上是一个group by查询,并且不能包含id。

我绝对想要使用原始sql,而不是使用其他方式来做“group by”。

2 个答案:

答案 0 :(得分:0)

这很有用。将元组的元组转换为字典列表,并从cursor.description获取字段描述。可以做成一个小功能。并且可能有一些聪明的lamdba可以缩短它。

        cursor = connection.cursor()
        cursor.execute(my_select)
        results = cursor.fetchall()

        x = cursor.description
        resultsList = []   
        for r in results:
            i = 0
            d = {}
            while i < len(x):
                d[x[i][0]] = r[i]
                i = i+1
            resultsList.append(d)

        return render_to_response(my_template, {"results":resultsList})

答案 1 :(得分:0)

如果您坚持需要使用MySQLdb游标执行原始sql查询,则创建字典游标DictCursor,以便可以按名称而不是按位置访问列值。

 cursor.close ()
 cursor = conn.cursor (MySQLdb.cursors.DictCursor)
 cursor.execute ("SELECT id, name FROM people")
 results = cursor.fetchall ()
 for row in results:
     print "%s, %s" % (row["id"], row["name"])

使用DictCursor您不需要做任何事情只需将其传递给模板并使用它与使用django查询集的方式相同。