1

我需要执行原始查询:

 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”的方式。

4

2 回答 2

1

这行得通。将元组的元组转换为字典列表,并从 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})
于 2013-01-10T18:34:30.743 回答
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 查询集相同的方式使用它。

于 2013-01-10T18:46:31.203 回答